3

Java8之22个lambda表达式用法入门示例超简单,这还不会你就Out了

 1 year ago
source link: https://www.51cto.com/article/742673.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
5172a2a49ed92493c507444f629c440eef17a8.png

lambda表达式简明扼要的以流水线的方式去处理集合内的数据,可以很轻松的完成过滤、分组、收集、归约这类操作。

总得来说,lambda的操作分为两类:中间型和最终型。

e1bc10692de89c79557512e1e08b4759134b35.png

中间型操作

1、filter

filter会按照指定的条件匹配出符合要求的元素,并返回一个新的stream流,可以配合其他中间型或最终型API使用。

List<String> dataList = Lists.newArrayList("first", "second", "third");
List<String> filter = dataList.stream()
        .filter(
          //筛选出值为second的匹配项
          data -> data.equals("second")
        )
        .collect(Collectors.toList());
System.out.println(filter);// [second]

2、map

map可以将一个对象转换为另一个对象,并返回一个新的stream流,比如将一个Integer对象转换为String对象。

List<Integer> dataList = Lists.newArrayList(1, 2, 3);
List<String> transform = dataList.stream()
        .map(
            //也可以写成String::valueOf
            data -> String.valueOf(data)
        )
        .collect(Collectors.toList());
System.out.println(JSON.toJSONString(transform));// ["1","2","3"]

3、peek

peek会对流中的元素逐个遍历处理,它与map的区别在于:map一般用于对象的转换,peek用于对象的消费,即不改变元素本身的类型。

List<String> dataList = Lists.newArrayList("a", "b", "c");
List<String> transform = dataList.stream()
    //peek是对元素逐一消费,在这里程序会逐个打印a、b、c
    .peek(data -> System.out.println(data))
    //map是对元素进行转换,这里将其转成大写:["A","B","C"]
    .map(data -> data.toUpperCase())
    .collect(Collectors.toList());

4、flatMap

flatMap可以将已有的对象转换为另一个对象,它是一个一对多的逻辑。它与map的区别在于:map是一对一的,即将一个对象转换为另一个对象,而flatMap是一对多的,即将一个对象拆分对多个对象。

//将["hello", "world"]转换为["h","e","l","l","o","w","o","r","l","d"]
List<String> dataList = Lists.newArrayList("hello", "world");
List<String> transform = dataList.stream()
    .flatMap(
      data -> Arrays.stream(data.split(""))
    )
    .collect(Collectors.toList());
System.out.println(JSON.toJSONString(transform));

5、limit

就相当于sql中的limit,可以指定保留前N的元素。

List<String> dataList = Lists.newArrayList("hello", "world", "good", "boy");
List<String> transform = dataList.stream()
      .limit(2)
      .collect(Collectors.toList());
System.out.println(JSON.toJSONString(transform));
//["hello","world"]

6、skip

作用与limit相反,会抛弃前N的元素。

List<String> dataList = Lists.newArrayList("hello", "world", "good", "boy");
List<String> transform = dataList.stream()
      .skip(2)
      .collect(Collectors.toList());
System.out.println(JSON.toJSONString(transform));
//["good","boy"]

7、concat

可以将多个流的数据合并为一个流。

List<String> transform = Stream.concat(
      Stream.of("hello"),
      Stream.of("world")
    ).collect(Collectors.toList());
System.out.println(JSON.toJSONString(transform));
//["hello","world"]

8、distinct

用于对流中的元素去重。

ArrayList<String> dataList = Lists.newArrayList("1", "2", "2", "3", "3");
List<String> transform = dataList.stream().distinct().collect(Collectors.toList());
System.out.println(JSON.toJSONString(transform));
//["1","2","3"]

9、sorted

用于对流中的数据排序。

ArrayList<String> dataList = Lists.newArrayList("1", "3", "4", "2", "3");
List<String> transform = dataList.stream()
    .sorted(
      Comparator.comparingInt(Integer::parseInt)
    )
    .collect(Collectors.toList());
System.out.println(JSON.toJSONString(transform));
//["1","2","3","3","4"]
133bdc7147c4ab30a5b557b1bb79662c582a05.png

最终型操作

10、count

统计元素的个数,不会自动去重。

ArrayList<String> dataList = Lists.newArrayList("1", "3", "4", "2", "3");
long count = dataList.stream().count();
System.out.println(count);
//5

11、max

匹配元素最大值并返回。

ArrayList<String> dataList = Lists.newArrayList("1", "3", "4", "2", "3");
String max  = dataList.stream().max(
    Comparator.comparing(Integer::parseInt)
  ).get();
System.out.println(max);
//4

12、min

匹配元素最小值并返回。

ArrayList<String> dataList = Lists.newArrayList("1", "3", "4", "2", "3");
String min  = dataList.stream().min(
    Comparator.comparing(Integer::parseInt)
  ).get();
System.out.println(min);
//1

13、findFirst

找到第一个匹配的元素后立即返回。

ArrayList<String> dataList = Lists.newArrayList("1", "3", "4", "2", "3");
String first  = dataList.stream().findFirst().get();
System.out.println(first);
//1

14、findAny

找到任何匹配的元素就返回。如果用在一个串行流中,跟findFirst效果一样。如果用在并行流中,就会比较高效。

int asInt = IntStream.range(1, 10).parallel().findAny().getAsInt();
System.out.println(asInt);
//6

15、anyMatch

用于判断是否有符合匹配条件的元素。

ArrayList<String> dataList = Lists.newArrayList("1", "3", "4", "2", "3");
boolean match  = dataList.stream().anyMatch(
    data -> data.equals("3")
  );
System.out.println(match);
//true

16、allMatch

用于判断是否所有元素都符合匹配条件。

ArrayList<String> dataList = Lists.newArrayList("1", "3", "4", "2", "3");
boolean match  = dataList.stream().allMatch(
      data -> data.equals("3")
   );
System.out.println(match);
//false

17、noneMatch

用于判断是否所有元素都不符合匹配条件。

ArrayList<String> dataList = Lists.newArrayList("1", "3", "4", "2", "3");
boolean match  = dataList.stream().noneMatch(
    data -> data.equals("3")
);
System.out.println(match);
//false

18、collect

将流转换为指定的类型,比如List转换为Set。

ArrayList<String> dataList = Lists.newArrayList("1", "3", "4", "2", "3");
Set<String> collect = dataList.stream().collect(Collectors.toSet());
System.out.println(collect);
//[1, 2, 3, 4]

19、reduce

将元素合并起来,得到一个新值。

int reduce = IntStream.range(0, 10).reduce(0, (v1, v2) -> v1 + v2);
System.out.println(reduce);//45

20、toArray

将流转换为数组。

ArrayList<String> dataList = Lists.newArrayList("1", "3", "4", "2", "3");
Object[] collect = dataList.stream().toArray();
System.out.println(JSON.toJSONString(collect));
//["1","3","4","2","3"]

21、iterator

将流转换为一个迭代器。

ArrayList<String> dataList = Lists.newArrayList("1", "3", "4", "2", "3");
Iterator<String> iterator = dataList.stream().iterator();
while (iterator.hasNext()) {
  System.out.println(iterator.next());
}

22、foreach

对流中的元素逐个遍历。

ArrayList<String> dataList = Lists.newArrayList("1", "3", "4", "2", "3");
dataList.stream().forEach(
    data -> System.out.println(data)
);
//等同于
dataList.forEach(data-> System.out.println(data));

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK