视频链接:03_lambda表达式初步与函数式接口_哔哩哔哩_bilibili
(parm1,parm2,parm3) -> {
}
1.如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口。
2.如果在某个接口上声明了FunctionalInterface注解,那么编译器就会按照函数式接口的定义要求该接口。
3.如果某个接口只有一个抽象方法,但我们并没有给该接口声明FunctionalInterface注解,那么编译器依旧会将该接口看做是函数式接口。

1.使用lambda表达式 简化遍历:


2.使用方法引用 ,简化遍历:

在java中,lambda表达式是对象,他们必须依附于函数式接口。
倒序排序:
- import java.util.Arrays;
- import java.util.Collections;
- import java.util.Comparator;
- import java.util.List;
-
- public class StringComparator {
- public static void main(String[] args) {
- List
names = Arrays.asList("zhangsan", "lisi", "wangwu"); - // Collections.sort(names, new Comparator
() { - // @Override
- // public int compare(String o1, String o2) {
- // return o2.compareTo(o1);//倒序
- // }
- // });
-
- // Collections.sort(names, (o1, o2) -> {return o2.compareTo(o1);});
- // System.out.println(names);
-
- // Collections.sort(names, Comparator.reverseOrder());
- // System.out.println(names);
-
- Collections.sort(names, (o1, o2) -> o2.compareTo(o1));
- System.out.println(names);
-
- }
- }


为了简化代码,使用流Stream

也可以换一种 方法引用的形式

-------------------------------------------------------------8.22-----------------------------------------------------------
例子:function中的compose方法和andThen方法的区别:
compose方法先执行后面的(function2),andThen先执行前面的(function1)

eg:使用BiFunction实现加减乘除

eg2:使用BiFunction的andThen方法(注意后面是function,而不是BiFunction,这是因为参数个数的问题,BiFunction没有compose方法也是这个原因,返回一个参数不足以供给两个参数的BiFunction)
输出结果:25

eg:stream在实际中的应用

例2
更灵活的方法:

---------------------------------------------------------------------
总结一下:
1.过滤(filter),去重(distinct),获取流中的第一个元素(findFirst);
- public class Demo {
- public static void main ( String[] args ) {
- // 流的筛选
- List
integerList = Arrays.asList(1, 2, 3,3, 4, 5, 6); - // 筛选出集合中数字大于4的元素
- List
collect = integerList.stream().filter(x -> x > 4).collect(Collectors.toList()); - System.out.println(collect); //[5, 6]
- // 集合中的去重
- List
collect1 = integerList.stream().distinct().collect(Collectors.toList()); - System.out.println(collect1);//[1, 2, 3, 4, 5, 6]
- // 获取流中的第一个元素
- Optional
first = integerList.stream().filter(x -> x > 4).findFirst(); - Optional
any = integerList.stream().filter(x -> x > 4).findAny(); - Optional
any1 = integerList.parallelStream().filter(x -> x > 4).findAny(); - System.out.println(first); //Optional[5]
- System.out.println(any); //Optional[5]
- System.out.println(any1); // 预期结果不稳定
-
- }
- }
-
2.获取最大值(max),最小值(min),计数(count)
- public class Demo {
- public static void main(String[] args) {
- List
stringList = Arrays.asList("huainvhai", "xiaotiancai", "bennvhai"); - // 获取集合中最长的字符串
- Optional
maxString = stringList.stream().max(Comparator.comparing(String::length)); - // 获取集合中最短字符串
- Optional
minString = stringList.stream().min(Comparator.comparing(String::length)); - System.out.println(maxString);
- System.out.println(minString);
-
-
-
- // 获取集合中的最大值
- List
integerList = Arrays.asList(1, 2, 3); - Optional
maxInteger = integerList.stream().max((i, j) -> { - return i - j;
- });
- // 获取集合中的最小值
- Optional
minInteger = integerList.stream().max((i, j) -> { - return j - i;
- });
- System.out.println(maxInteger);
- System.out.println(minInteger);
-
-
-
-
- // 集合泛型是个对象的最值
- ArrayList
personList = new ArrayList<>(); - personList.add(new Person("xiao",12));
- personList.add(new Person("xiao",20));
- personList.add(new Person("xiao",18));
- Optional
max = personList.stream().max(Comparator.comparing(Person::getAge)); - // 获取集合中的元素数量
- long count = personList.stream().filter(p -> p.getAge() > 12).count();
- System.out.println(max);
- System.out.println(count);
- }
- }
3.缩减(reduce):就是把一个流缩减成一个值,比如说对一个集合中求和,求乘积等
- public class Demo4 {
- public static void main(String[] args) {
- List
integers = Arrays.asList(1, 2, 3, 4); - // 写法一 集合中的元素求和 (就是集合中的元素求和再加上1)
- Integer integer = integers.stream().reduce(1, Integer::sum);
- // 写法二
- integers.stream().reduce(1,(x,y)->x+y);
- System.out.println(integer); // 11
-
- // 第二种缩减方式 集合中的元素求和
- Optional
reduce = integers.stream().reduce(Integer::sum); - // 写法二
- Optional
reduce1 = integers.stream().reduce((x, y) -> x + y); - System.out.println(reduce); //Optional[10]
- System.out.println(reduce1); //Optional[10]
-
- // 集合中使用reduce求最值问题
- Optional
reduce2 = integers.stream().reduce(Integer::max); - System.out.println(reduce2);
-
- /**
- * 对象集合求和 求最值问题
- */
- ArrayList
personList = new ArrayList<>(); - personList.add(new Person("xiao",12));
- personList.add(new Person("xiao",20));
- personList.add(new Person("xiao",18));
- // 求集合中对象的年龄的总和
- Optional
reduce3 = personList.stream().map(p -> p.getAge()).reduce(Integer::sum); - System.out.println(reduce3); //Optional[50]
-
- // 求集合中年龄最大的对象
- Optional
reduce4 = personList.stream().reduce((p1, p2) -> p1.getAge() > p2.getAge() ? p1 : p2); - Optional
max = personList.stream().max(Comparator.comparingInt(Person::getAge)); - System.out.println(reduce4);
- System.out.println(max);
- }
- }
4.汇集(collect)
- public class Demo5 {
- public static void main(String[] args) {
- ArrayList
personList = new ArrayList<>(); - personList.add(new Person("xiao",12));
- personList.add(new Person("xiao",20));
- personList.add(new Person("xiao",18));
- // 获取平均年龄 averaging
- Double collect = personList.stream().collect(Collectors.averagingInt(Person::getAge));
- System.out.println(collect); //16.666666666666668
-
- // summarizing
- DoubleSummaryStatistics collect1 = personList.stream().collect(Collectors.summarizingDouble(Person::getAge));
- System.out.println(collect1); // DoubleSummaryStatistics{count=3, sum=50.000000, min=12.000000, average=16.666667, max=20.000000}
-
- //joining
- String collect2 = personList.stream().map(p -> p.getName()).collect(Collectors.joining(","));
- System.out.println(collect2); //xiao,xiao,xiao
-
- // reduce
- Integer collect3 = personList.stream().collect(Collectors.reducing(0, Person::getAge, (x, y) -> x + y));
- Optional
reduce = personList.stream().map(Person::getAge).reduce(Integer::sum); - System.out.println(collect3); //50
- System.out.println(reduce); //Optional[50]
-
- // groupingBy
- // 以名字进行分组
- Map
> collect4 = personList.stream().collect(Collectors.groupingBy(Person::getName)); - System.out.println(collect4); //{xiao=[Person(name=xiao, age=12), Person(name=xiao, age=20), Person(name=xiao, age=18)]}
- // 先以名字分组,再以年龄分组
- Map
>> collect5 = personList.stream().collect(Collectors.groupingBy(Person::getName, Collectors.groupingBy(Person::getAge))); - System.out.println(collect5); //{xiao={18=[Person(name=xiao, age=18)], 20=[Person(name=xiao, age=20)], 12=[Person(name=xiao, age=12)]}}
-
- // toList、toSet、toMap
- Set
collect6 = personList.stream().collect(Collectors.toSet()); - System.out.println(collect6);//[Person(name=xiao, age=18), Person(name=xiao, age=20), Person(name=xiao, age=12)]
-
- }
- }
5.映射(map):将一个流的元素按照一定的映射规则映射到另一个流中
- public class Demo6 {
- public static void main(String[] args) {
- String[] strArr = { "abcd", "bcdd", "defde", "ftr" };
- Arrays.stream(strArr).map(x->x.toUpperCase()).forEach(System.out::print); //ABCDBCDDDEFDEFTR
- List
collect = Arrays.stream(strArr).map(x -> x.toUpperCase()).collect(Collectors.toList()); - System.out.println(collect); // [ABCD, BCDD, DEFDE, FTR]
-
- }
- }
6.排序(Sorted)
- public class Demo7 {
- public static void main(String[] args) {
- String[] strArr = { "ab", "bcdd", "defde", "ftr" };
- // 自然排序
- List
collect = Arrays.stream(strArr).sorted().collect(Collectors.toList()); - System.out.println(collect); // [ab, bcdd, defde, ftr]
-
- // 自定义排序
- // 按照字符串的长度 长度 从小到大
- List
collect1 = Arrays.stream(strArr).sorted(Comparator.comparing(String::length)).collect(Collectors.toList()); - System.out.println(collect1); //[ab, ftr, bcdd, defde]
- // 按照字符串的长度逆序排序
- List
collect2 = Arrays.stream(strArr).sorted(Comparator.comparing(String::length).reversed()).collect(Collectors.toList()); - System.out.println(collect2); //[defde, bcdd, ftr, ab]
-
- // 首字母倒序
- List
collect3 = Arrays.stream(strArr).sorted(Comparator.reverseOrder()).collect(Collectors.toList()); - System.out.println(collect3); //[ftr, defde, bcdd, ab]
- // 首字母自然排序
- List
collect4 = Arrays.stream(strArr).sorted(Comparator.naturalOrder()).collect(Collectors.toList()); - System.out.println(collect4); //[ab, bcdd, defde, ftr]
- }
- }
7.组合(concat)、跳过(skip)
- public class Demo8 {
- public static void main(String[] args) {
- String[] arr1 = {"a","b","c","d"};
- String[] arr2 = {"d","e","f","g"};
- String[] arr3 = {"i","j","k","l"};
-
- Stream
stream1 = Arrays.stream(arr1); - Stream
stream2 = Arrays.stream(arr2); - Stream
stream3 = Arrays.stream(arr3); - // 可以把两个stream合并成一个stream(合并的stream类型必须相同),只能两两合并
- // List
collect = Stream.concat(stream1, stream2).collect(Collectors.toList()); - // System.out.println(collect); //[a, b, c, d, d, e, f, g]
- // 合并去重
- List
collect1 = Stream.concat(stream1, stream2).distinct().collect(Collectors.toList()); - System.out.println(collect1); //[a, b, c, d, e, f, g]
-
- // limit,限制从流中获得前n个数据
- // List
collect = collect1.stream().limit(3).collect(Collectors.toList()); - // System.out.println(collect); //[a, b, c]
-
- // skip,跳过前n个数据
- List
collect = collect1.stream().skip(1).limit(3).collect(Collectors.toList()); - System.out.println(collect);//[b, c, d]
- }
- }