一:lambda表达式
其实就是实现接口的,实现接口可以创建类来实现,也可以直接用匿名内部类,lambda就是匿名函数。但是对接口是有要求的,接口的抽象方法只能有一个,这种接口叫做函数式接口,一般会用注解@FunctionalInterface 修饰。由三种符号组成。(), ->,{}方法体 。()里面就是接口抽象方法的参数。{} 里面写逻辑,抽象方法有返回类型的话这儿要return对应的类型。
简化规则:1 ()中参数的类型可以省略,参数如果只有一个,()可以省略。
2 当方法体{}只有一句的时候 {} 可以省略不写,当这一句是return语句的话,要把return也去掉。
进阶:
方法引用: 当接口的那个抽象方法在很多地方被引用的时候,会有很多重复的实现,可以写一个公共函数写进去。{}方法体就可以直接引用实现好的方法了。引用方法的参数类型 和返回类型要和接口中方法的参数类型 和返回类型要一致。
构造方法引用:用类名 :: new 就行
例子:
list里面排序 用lambds就会很简单
还有用treeSet填写数据的时候比如添加对象时候无法判断大小的情况下 这种写法也会方便
这样写会让重复的不被删除
list foreach遍历
利用Stream流来遍历 下面的代码是便利后每个元素都加上自己乘0.12。其实也是把一个list放到另一个集合中
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Test3 {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(100,200,300,400);
//stream()把集合转成了流
//map(方法), 把流里面的每个元素都执行一些
//map里面的方法,转换了一下。
//collect(Collectors.toList()) 把转换以后的元素
//收集起来放到一个新的list里面
List ls= list.stream().map((cost)->cost + cost * .12).collect(Collectors.toList());
//遍历集合costBeforeTax,并且打印里面的元素
ls.forEach(a->System.out.println(a));
}
}
一般把一个集合数据放到另一个集合。
package cn.test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Test { public static void main(String[] args) { List<Integer> list2 = new ArrayList<>(); List<Integer> list = Arrays.asList(100, 120); list.forEach(a -> { list2.add(a + 10); }); list2.forEach(System.out::println); } }
还有一种情况是把满足条件的的放到另一个集合 用Steam流来写 用filter. 后面的值就是判断值
package cn.test; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Test { public static void main(String[] args) { List<Integer> list = Arrays.asList(100, 120); List ls= list.stream().filter((cost)->cost==100).collect(Collectors.toList()); ls.forEach(System.out::println); } }
结果为 100哈
当然也可以结合起来用,结果就是返回200了
package cn.test; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Test { public static void main(String[] args) { List<Integer> list = Arrays.asList(100, 120); List ls= list.stream().map((cost)->cost+100).filter(a->a==200).collect(Collectors.toList()); ls.forEach(System.out::println); } }
package cn.test; import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; public class Test { public static void main(String[] args) { List<Integer> list = Arrays.asList(100, 120); List ls= list.stream().map((cost)->cost+100).filter(Objects::nonNull).collect(Collectors.toList()); ls.forEach(System.out::println); } }
lsit 删除元素
系统内置函数接口
如 removeif中的 Predicate接口 foreach中的Consumer接口