lambda表达式详解

发布于:2022-12-18 ⋅ 阅读:(498) ⋅ 点赞:(0)

lambda表达式

本质:

将接口实例对象,当作属性传

演变过程

内部类 -> 匿名内部类 -> 函数式接口 -> 创建线程的三种方式 -> Stream的使用

内部类

普通内部类:Sub类,定义在类中的类,如:
定义:

public class FunctionalTest {
    public class Sub {
        private int a;
        private String b;
        public int getA() {
            return a;
        }
    }
}
使用:
public class Test {
    public static void main(String[] args) {
        FunctionalTest functionalTest = new FunctionalTest();
        FunctionalTest.Sub sub1 = functionalTest.new Sub();
        sub1.getA();
    }
}       

静态内部类,使用static修饰的内部类,如:Sub

FunctionalTest.Sub sub = new FunctionalTest.Sub();

方法内部类:定义在方法内部。

匿名内部类

  内部类的简化,直接在使用的方法中,直接在new出来对象放在参数中。
public interface Calculate {
    int sum(int a, int b);
}

public class FunctionalTest {
    int toSum(Calculate calculate, int a, int b) {
        return calculate.sum(a, b);
    }
}

public class Test {
    public static void main(String[] args) {
        FunctionalTest functionalTest = new FunctionalTest();
        functionalTest.toSum((a, b)-> a+b, 1, 2);//匿名内部类的使用
    }
}

函数式接口

简单地说,就是只有一个抽象方法的接口,不包括从object类中继承的方法,和default,static修饰的方法。
如:使用@FunctionalInterface修饰

@FunctionalInterface
public interface Calculate {
    int sum(int a, int b);
    default int value(int A){
        return A;
    }
    static String getName(){
        return "A";
    }
}

创建线程的三种方式

1,继承Thread类,重写run()方法。
ThreadByThread threadByThread = new ThreadByThread();
threadByThread.setName("ThreadByThread");
threadByThread.start();
2,实现runnable接口,重写run()方法
Thread threadByRunnable = new Thread(new ThreadByRunnable());
//Thread threadByRunnable = new Thread(() -> System.out.println(Thread.currentThread().getName()));
threadByRunnable.setName("ThreadByRunnable");
threadByRunnable.start();
3,实现callable接口,重写call()方法,这个是有返回值,
FutureTask<String> stringFutureTask = new FutureTask<>(new ThreadByCallable());
//FutureTask<String> stringFutureTask = new FutureTask<>(() -> "return String");
Thread threadByCallable = new Thread(stringFutureTask);
threadByCallable.setName("ThreadByCallable");
threadByCallable.start();
try {
    String s = stringFutureTask.get();
    System.out.println(s);
} catch (InterruptedException e) {
    e.printStackTrace();
} catch (ExecutionException e) {
    e.printStackTrace();
}

Stream的使用

  贴心准备的函数式接口:下面这些接口,可以作为方法的参数。
Consumer<? super T> Consumer<T>  消费型:接收一个参数T,不返回结果
Supplier<? extends T> Supplier<T>  供给型:不接收参数,返回T对象创建的工厂
Predicate<? super T> Predicate<T>  断言型:接收参数T,返回一个Boolean类型的结果
Function<? super T, ? extends U> Function<T, R> 功能型:接收参数对象T,返回结果对象R
  应用:
    String分割成数组
String s = "aa,bb,cc,dd,ee,ff,gg";
String[] split = s.split(",");
Arrays.stream(split).forEach(a-> System.out.println(a));
    map的遍历
Map<Integer, String> map = Collections.emptyMap();
map.forEach((k, v)->System.out.println(k+"->"+v));
本文含有隐藏内容,请 开通VIP 后查看