Lambda表达式
1、什么是Lambda表达式
Lambda就是匿名内部类的简化形式,返回一个接口类对象
2、语法
(参数,参数)->{表达式代码}
3、函数式接口
只有一个抽象方法的接口叫函数式接口
4、Lambda表达式简写
某些情况下可以省略参数列表的括号和表达式代码的括号,例如
PrintMsg p = msg->System.out.println("msg");
java.util.function中的函数式接口
1、@FunctionalInterface注解,表明函数式接口
@FunctionalInterface public interface Consumer<T> { void accept(T t); }
2、Function函数式接口,一个参数一个返回值
public static void main(String[] args) { //输入字符串,返回字符串长度。第一个泛型是参数类型,第二个是返回值类型 Function<String,Integer> method=str->str.length(); Integer length = method.apply("123"); System.out.println(length); }
3、andThen方法,调用两个函数式接口处理一个数据
public static void main(String[] args) { //输入字符串,返回字符串长度。第一个泛型是参数类型,第二个是返回值类型 Function<String,String> before=s1->"www."+s1; Function<String,String> after=s1->s1+".com"; //先执行before.apply("baidu"),然后将结果s1传给agter.apply(s1) String res = before.andThen(after).apply("baidu"); System.out.println(res);//www.baidu.com }
4、BiFunction,两个参数,一个返回值接口
void test1(){ //传递两个参数的lambda函数 BiFunction<Integer,Integer,String> fun1=(a,b)->{ return a+b+""; }; String res = fun1.apply(1, 2); System.out.println(res);//3 }
5、Consumer有参数无返回值接口和Supplier无参数有返回值接口
void test2(){ //消费者接口,接收参数,无返回值 Consumer<Integer> fun1 = num->{ System.out.println(num); }; fun1.accept(3); //构造器接口(生产者接口),用来创建对象 Supplier<String> fun2=String::new; String s=fun2.get();//获取创建对象 //有参构造器接口 Function<String,String> fun3=String::new; String str = fun3.apply("lisi"); System.out.println(str); }
6、Predicate断言接口,一个参数,test方法返回boolean值
void test2(){ //断言接口,对参赛进行判断返回布尔值 Predicate<Integer> fun1=num->num>0; System.out.println(fun1.test(-1));//判断-1是否大于0。false }
Stream流操作集合
应用场景
处理集合,替代for操作,简化流程、提高效率
注意事项
-
流只能调用一次,list.stream(),list.stream()报错
-
流操作必须有终结方法,不然中间操作不会执行
一、将对象变为流
三种方法
1、对象.stream()方法
2、对象.parallelStream()方法
3、Stream.of(arr)或多个参数
二、流的方法(常用的)
filter | 过滤方法,参数Predicate接口,lambda返回值布尔值 |
---|---|
distinct | 去重方法,无参数 |
limited | 获取流中前n个数据 |
skip | 获取丢弃前n个数据 |
map | 对流中元素统一处理,参数Function接口 |
forEach | 一个个处理流元素,参数Consumer接口 |
sorted | 排序,可以无参数 |
max | 获取最大值,参数Comparator接口 |
concat | 合并流,参数两个Stream类 |
方法举例
filter、limit和distinct方法
void test1(){ List<String> list= Arrays.asList("qwe","rty","asd","asd","fgh"); List<String> res = list.stream().filter(str -> str.contains("a")).distinct().limit(1).collect(Collectors.toList()); System.out.println(res);//asd }
map方法,获取list包含a的字符的元素,并返回大写的集合
void test1(){ List<String> list= Arrays.asList("qwe","rty","asd","asd","fgh"); List<String> res = list.stream().filter(str -> str.contains("a")).map(str->str.toUpperCase()).collect(Collectors.toList()); System.out.println(res);//ASD }
max方法获取最大值
Optional<Integer> max = Stream.of(1,2,3,4).max((o1, o2) -> o1 - o2);
三、终止符
anyMatch | 集合中是否有一个满足条件,布尔值,参数Predicate接口。其他还有allMatch,noneMatch |
---|---|
collect | 收集流 |
reduce | 参数 默认值,BiFunction接口,汇总处理的方法 |
count | 统计流元素个数 |
reduce方法获取最大值
Optional<Integer> reduce = Stream.of(1, 2, 3, 4).reduce((a, b) -> a > b ? a : b); System.out.println(reduce.get());