1.Lambda表达式
介绍


使用


// 1.无参,无返回值
Runnable r1 = new Runnable() {
//匿名内部类
@Override
public void run() {
System.out.println("我爱njupt");
}
};
Runnable runnable = () -> System.out.println("你好");
// 2.只需一个参数,但没有返回值
Consumer<String> consumer1 = new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
};
consumer1.accept("666");
Consumer<String> consumer2 = (str) -> {
//参数str的String类型可以省略不写
System.out.println(str);
};
consumer2.accept("666");

类似的类型推断有:
ArrayList<Integer> arrayList = new ArrayList<>(); //后面<>可不写,因为类型推断
int[] arr = new int[]{
1,2,3,4};
int[] arr = {
1, 2, 3, 4}; //类型推断
2.函数式接口
介绍


// 自定义函数式接口
@FunctionalInterface
public interface myInterFace {
void run(); // 只包含一个抽象方法
}
四大核心函数式接口

@Test
public void test01() {
List<String> list = Arrays.asList("北京", "天津", "南京", "味精");
//1.不用lambda
// List<String> filterString = filterString(list, new Predicate<String>() {
// @Override
// public boolean test(String s) {
// return s.contains("京");
// }
// });
// System.out.println(filterString);
//2.使用lambda
List<String> filterString = filterString(list, s -> s.contains("京"));
System.out.println(filterString);
}
public static List<String> filterString(List<String> list, Predicate<String> pre) {
ArrayList<String> filterList = new ArrayList<>();
for (String s : list) {
if(pre.test(s)) {
filterList.add(s);
}
}
return filterList;
}
其他接口

3.方法引用、构造器引用
介绍

使用
// 情况一:对象 :: 实例方法
//Consumer中的void accept(T t)
//PrintStream中的void println(T t)
@Test
public void test1() {
Consumer<String> con1 = str -> System.out.println(str);
con1.accept("我爱njupt");
System.out.println("******************************");
PrintStream ps = System.out;
Consumer<String> con2 = ps::println;
con2.accept("我爱njupt");
}
//Supplier中的T get()
//Employee中的String getName()
@Test
public void test2(