Java 8 Stream常用方法

x33g5p2x  于2021-11-30 转载在 Java  
字(3.3k)|赞(0)|评价(0)|浏览(271)

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream(流)是一个来自数据源的元素队列并支持聚合操作。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
简单总结一下常用的API方法

数据准备

DTO

public class StreamDemoDTO {
    private int id;
    private String name;
    private int age;
    private int sex;
    private Date birthDay;
    // getter && setter
    // Override toString for print
 }

init

public static void initList() throws ParseException {
        sdf.applyPattern(YYYY_MM_DD_PATTERN);
        StreamDemoDTO dto1 = new StreamDemoDTO(1,"刘一",18,0,sdf.parse("1990-11-22"));
        StreamDemoDTO dto2 = new StreamDemoDTO(1,"陈二",20,1,sdf.parse("2000-10-22"));
        StreamDemoDTO dto3 = new StreamDemoDTO(1,"张三",16,1,sdf.parse("1998-01-12"));
        StreamDemoDTO dto4 = new StreamDemoDTO(1,"李四",55,0,sdf.parse("1990-11-05"));
        StreamDemoDTO dto5 = new StreamDemoDTO(1,"王五",60,0,sdf.parse("1990-06-06"));
        StreamDemoDTO dto6 = new StreamDemoDTO(1,"赵六",33,1,sdf.parse("1997-01-09"));
        StreamDemoDTO dto7 = new StreamDemoDTO(1,"钱七",40,0,sdf.parse("1994-02-09"));
        StreamDemoDTO dto8 = new StreamDemoDTO(1,"周八",28,1,sdf.parse("1999-12-18"));
        StreamDemoDTO dto9 = new StreamDemoDTO(1,"吴九",31,0,sdf.parse("1990-05-22"));
        StreamDemoDTO dto10 = new StreamDemoDTO(1,"郑十",30,1,sdf.parse("1995-04-03"));
        demoDTOList.add(dto1);
        demoDTOList.add(dto2);
        demoDTOList.add(dto3);
        demoDTOList.add(dto4);
        demoDTOList.add(dto5);
        demoDTOList.add(dto6);
        demoDTOList.add(dto7);
        demoDTOList.add(dto8);
        demoDTOList.add(dto9);
        demoDTOList.add(dto10);
    }

forEach

迭代流中的每个数据

demoDTOList.forEach(System.out::println);
	demoDTOList.forEach( dto -> {
		System.out.println(dto.getName());
	});

map

用于映射每个元素到对应的结果

List<Integer> idList = demoDTOList.stream().map(StreamDemoDTO::getId).collect(Collectors.toList());

filter

用于通过设置的条件过滤出元素

List<StreamDemoDTO> ageBiggerThan18 = demoDTOList.stream().filter(streamDemoDTO -> streamDemoDTO.getAge() > 18).collect(Collectors.toList());

limit

用于获取指定数量的流

List<StreamDemoDTO> limitDemoList = demoDTOList.stream().limit(3).collect(Collectors.toList());

sorted

用于对流进行排序

List<StreamDemoDTO> sortedByAgeList = demoDTOList.stream().sorted(Comparator.comparing(StreamDemoDTO::getAge)).collect(Collectors.toList());

count

long count = demoDTOList.stream().count();

distinct

用于去重

List<String> distinctNameList = demoDTOList.stream().map(StreamDemoDTO::getName).distinct().collect(Collectors.toList());

reversed

用于反转顺序

List<StreamDemoDTO> sortedByAgeDescList = demoDTOList.stream().sorted(Comparator.comparing(StreamDemoDTO::getAge).reversed()).collect(Collectors.toList());

Collectors

实现了很多归约操作

String names = demoDTOList.stream().map(StreamDemoDTO::getName).collect(Collectors.joining(","));
Set<String> nameSet = demoDTOList.stream().map(StreamDemoDTO::getName).collect(Collectors.toSet());
List<String> distinctNameList = demoDTOList.stream().map(StreamDemoDTO::getName).distinct().collect(Collectors.toList());
Map<Integer, StreamDemoDTO> streamDemoDTOMap = demoDTOList.stream().collect(Collectors.toMap(StreamDemoDTO::getId, Function.identity()));

findAny

StreamDemoDTO findAny = demoDTOList.stream().findAny().get();

findFirst

StreamDemoDTO findFirst = demoDTOList.stream().findFirst().get();

实际场景下,需要根据需求使用各个API的组合才能满足代码需要。
代码参考:https://gitee.com/code-promotion/my-code-test/tree/dev/src/main/java/cn/pengld/streamtest

相关文章

微信公众号

最新文章

更多