Lambda表示式使用2
阿新 • • 發佈:2018-12-13
1.概述
本篇主要介紹lambda中常用的收集器,收集器的作用就是從資料流中生成需要的資料結構。
最常用的就是Collectors.toList(),只要將它傳遞給collect()函式,就能夠使用它了。
在我們使用收集器的時候經常會用到“方法引用”這樣的簡寫語法:
方法引用:ClassName::methodName
2.程式碼示例
按照收集器的作用分類
公共程式碼:
@Data @NoArgsConstructor @AllArgsConstructor public class Artist { private String name; private String age; private boolean isMan; }
List<Artist> artists = Lists.newArrayList(); Artist artist1 = new Artist("kido", "28", false); Artist artist2 = new Artist("tom", "23", true); Artist artist3 = new Artist("whale", "22", false); Artist artist4 = new Artist("jack", "26", true); artists.add(artist1); artists.add(artist2); artists.add(artist3); artists.add(artist4);
// 1.方法引用:ClassName::methodName List<String> list = artists.stream().map(Artist::getName).collect(Collectors.toList()); list.forEach(name -> System.out.println(name)); // 2.元素順序,集合有序流就有序,集合無序流也無序,使用sorted()可以使得流變得有序 Set<Integer> numbers = new HashSet<>(Arrays.asList(4, 3, 2, 1, 6, 9, 8, 10)); numbers.stream().forEach(x -> System.out.println(x)); System.out.println("---------------------------"); List<Integer> numbersOrder = numbers.stream().sorted().collect(Collectors.toList()); numbersOrder.forEach(x -> System.out.println(x)); // 3.使用收集器, toList() toSet()等 Set<String> set = artists.stream().map(Artist::getName).collect(Collectors.toSet()); set.forEach(x -> System.out.println(x)); Map<String, String> map = artists.stream().collect(Collectors.toMap(Artist::getName, Artist::getAge)); map.forEach((key, value) -> System.out.println(key + "<--->" + value)); // 4.轉換成值, 找出年齡最大的 Optional<Artist> collect = artists.stream().collect(Collectors.maxBy(Comparator.comparing(item -> item.getAge()))); System.out.println(collect.get()); // 5.資料分塊, Predicate物件為true和false Map<Boolean, List<Artist>> map2 = artists.stream().collect(Collectors.partitioningBy(Artist::isMan)); map2.forEach((key, value) -> {System.out.println(key + "<--->" +value);}); // 6.資料分組,按照姓名分組 Map<String, List<Artist>> map3 = artists.stream().collect(Collectors.groupingBy(Artist::getAge)); map3.forEach((key, value) -> {System.out.println(key + "<--->" +value);}); // 7.字串,將收集流中的資料生成字串 String string = artists.stream().map(item -> item.getName()).collect(Collectors.joining(", ", "[", "]")); System.out.println(string); // 8.組合收集器, 使用groupingBy先分組在計數 Map<Boolean, Long> map4 = artists.stream().collect(Collectors.groupingBy(Artist::isMan, Collectors.counting())); map4.forEach((key, value) -> {System.out.println(key + "<--->" +value);});