关于lambda表达式
Lambda 是Jdk8推出的一个新特性,允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
Lambda表达式只支持函数式接口 也就是只有一个抽象方法的接口。用来实现接口
使用 Lambda 表达式可以使代码变的更加简洁紧凑,同时其实是在要求我们想的更多,写的更少。
基础表达式写法
(params) -> expression
(params) -> statement
(params) -> { statements }
// 1. 不需要参数,返回值为 5
() -> 5
// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y
// 4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)
常见lambda表达式使用场景
-
替代匿名内部类 最常见的就是创建线程了,用()->就可以代替整个匿名内部类,()中可以传唯一方法的参数,->后是方法的实现。其实就像是简化具体类的创建,不过只针对只有一个方法的接口、抽象类。
public static void main(String[] args) { Thread thread1 = new Thread(new Runnable() { @Override public void run() { System.out.println(add(1, 2)); } }); thread1.start(); new Thread( () -> System.out.println(add(2, 2))).start(); } public static int add(int a, int b) { return a + b; }
-
使用lambda表达式对集合进行迭代
public static void main(String[] args) { //遍历list List<String> list = Arrays.asList("a", "b", "c", "d"); List<String> newList = new ArrayList<>(); list.forEach(str -> add(str, newList)); System.out.println(newList.size()); newList.forEach(str -> System.out.println(str)); //遍历map Map<Integer, String> map = new HashMap<>(); map.put(1, "a"); map.put(2, "b"); map.forEach((k,v) -> System.out.println(k +" "+ v)); //遍历set Set<String> set = new HashSet<>(); set.add("a"); set.add("b"); set.forEach(str -> System.out.println(str)); //根据条件过滤 List<Integer> list = new ArrayList(); list.stream().filter(x -> x > 5); } private static void add(String str, List<String> list) { list.add(str); }
3.用lambda表达式实现map
需要用到JDK8新特性Stream,后续继续学习这个。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)
public static void main(String[] args) { //list转map,collect取决与传入的Collectors规则 //Collectors.toMap()会收集list,按定义的规则转成map List<String> list = Arrays.asList("a", "b", "c", "d"); Map map = list.stream().collect(Collectors.toMap(k -> k+1, v -> v+"a")); System.out.println(map); }