Lambda表达式:特殊的匿名内部类,语法更简洁。
<函数式接口> <变量名> = (参数1,参数2...) -> {
//方法体
};
->
(箭头操作符), ->
将表达式分成两部分
public class TestLambda {
public static void main(String[] args) {
//Lambda表达式:特殊的匿名内部类,语法更简洁。
//示例1: Runnable接口
//匿名内部类:
Runnable runnable1 = new Runnable() {
@Override
public void run() {
System.out.println("子线程1 开始执行...");
}
};
//简化: Lambda表达式
Runnable runnable2 = ()->{
System.out.println("子线程2 开始执行...");
};
//使用
new Thread(runnable1).start();
new Thread(runnable2).start();
//简写: 方法体只有一行代码时
new Thread(()-> System.out.println("子线程3 开始执行..."));
//示例2: Comparator比较器
//匿名内部类
Comparator<Integer> cmp1 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
};
//简化: Lambda表达式
Comparator<Integer> cmp2 = (o1, o2) -> o1 - o2;
TreeSet<Integer> treeSet1 = new TreeSet<>(cmp1);
TreeSet<Integer> treeSet2 = new TreeSet<>(cmp2);
}
}
IDEA 快捷键:
代码示例:
interface:
@FunctionalInterface //函数式接口: 只有一个抽象方法
public interface Usb {
void service();
}
Test:
public class TestUsb {
public static void main(String[] args) {
//匿名内部类
Usb usb1 = new Usb() {
@Override
public void service() {
System.out.println("连接成功, 开始工作...");
}
};
//Lambda表达式
Usb usb2 = () -> System.out.println("连接成功, 开始工作...");
}
}
函数式接口 | 参数类型 | 返回类型 | 说明 |
---|---|---|---|
Consumer<T> 消费型接口 | T | void | void accept(T t);对类型为T的对象应用操作 |
Supplier<T> 供给型接口 | 无 | T | T get(); 返回类型为T的对象 |
Function<T,R> 函数型接口 | T | R | R apply(T t);对类型为T的对象应用操作,并返回类型为R类型的对象。 |
Predicate<T> 断言型接口 | T | boolean | boolean test(T t);确定类型为T的对象是否满足条件,并返回boolean类型。 |
TestConsumer:
public class TestConsumer {
public static void main(String[] args) {
//匿名内部类
happy(new Consumer<Double>() {
@Override
public void accept(Double money) {
System.out.println(("聚餐吃饭, 花费:"+ money));
}
},1000);
//Lambda表达式
happy(money-> System.out.println("聚餐吃饭, 花费:"+money),2000);
}
public static void happy(Consumer<Double> consumer, double money) {
consumer.accept(money);
}
}
TestSupplier:
public class TestSupplier {
public static void main(String[] args) {
//匿名内部类
//获取5个100以内的随机数
int[] nums1 = getNums(new Supplier<Integer>() {
@Override
public Integer get() {
return new Random().nextInt(100);
}
},5);
System.out.println(Arrays.toString(nums1));
//Lambda表达式
//获取10个1000以内的随机数
System.out.println(Arrays.toString(getNums(() -> new Random().nextInt(1000),10)));
}
public static int[] getNums(Supplier<Integer> supplier, int length) {
int[] arr = new int[length];
for (int i = 0; i < arr.length; i++) {
arr[i] = supplier.get();
}
return arr;
}
}
TestFunction:
public class TestFunction {
public static void main(String[] args) {
//匿名内部类
String s1 = handleString(new Function<String, String>() {
@Override
public String apply(String s) {
return s.toUpperCase();
}
}, "hello");
System.out.println(s1);
//Lambda表达式
System.out.println(handleString(s -> s.toLowerCase(),"HELLO"));
}
public static String handleString(Function<String, String> function, String s) {
return function.apply(s);
}
}
TestPredicate:
public class TestPredicate {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("张三");
list.add("张三锋");
list.add("张耕耘");
list.add("韩羽");
list.add("张利");
list.add("田美丽");
//匿名内部类
List<String> list1 = filter(new Predicate<String>() {
@Override
public boolean test(String s) {
return s.startsWith("张");
}
}, list);
System.out.println(list1);
//Lambda 表达式
List<String> list2 = filter(s -> s.startsWith("田"), list);
System.out.println(list2);
}
public static List<String> filter(Predicate<String> p, List<String> src) {
ArrayList<String> list = new ArrayList<>();
for (String s : src) {
if (p.test(s)){
list.add(s);
}
}
return list;
}
}
代码演示:
形式1 : 对象::实例方法
public class TestMethodRef {
public static void main(String[] args) {
Consumer<String> consumer1 = s -> System.out.println(s);
Consumer<String> consumer2 = System.out::println;
consumer1.accept("xxx");
consumer2.accept("yyy");
}
}
res:
xxx
yyy