JDK8的Stream

    技术2022-07-11  105

    Stream流的使用方式

    1、Stream能帮我们做什么?2、创建流3、操作流

    1、Stream能帮我们做什么?

    1、业务需求:从中找出语文不及格的学生名字,并且按分数从高到低排序 2、传统的实现方式 // 筛选出不及格的考卷 List<Paper> failedPapers = new ArrayList<>(); for (Paper paper : papers) { if (paper.getClassName().equals("语文") && paper.getScore() < 60) { failedPapers.add(paper); } } // 按分数从高到低排序 Collections.sort(failedPapers, new Comparator<Paper>() { @Override public int compare(Paper o1, Paper o2) { return o2.getScore() - o1.getScore(); } }); // 记下不及格的学生名字 List<String> failedPaperStudentNames = new ArrayList<>(); for (Paper failedPaper : failedPapers) { failedPaperStudentNames.add(failedPaper.getStudentName()); } 3、使用Java8新特性Stream流 papers.stream() .filter(p -> p.getClassName().equals("语文") && p.getScore() < 60) .sorted((p1, p2) -> p2.getScore() - p1.getScore()) .map(Paper::getStudentName) .collect(Collectors.toList());

    2、创建流

    1、对于集合 List<String> list=new ArrayList<>(); Stream<String> stream = list.stream(); 2、对于数组 String[] arr= new String[]{"A", "B", "C"}; Stream<String> stream = Arrays.stream(arr);

    3、操作流

    1、中间操作 (1)filter 过滤 List<String> list = Arrays.asList("AA", "AB", "BC"); list.stream() .filter(s -> s.startsWith("A")) .forEach(System.out::println); // AA // AB2)distinct 去重 List<String> list = Arrays.asList("A", "A", "B"); list.stream() .distinct() .forEach(System.out::print); // AB3)limit 截断 List<String> list = Arrays.asList("A", "B", "C"); list.stream() .limit(2) .forEach(System.out::print); // AB4)skip 跳过元素 List<String> list = Arrays.asList("A", "B", "C"); list.stream() .skip(2) .forEach(System.out::print); // C5)map 将每一个元素映射成一个新的元素 List<Paper> papers = Arrays.asList( new Paper("小明", "语文", 40), new Paper("小红", "语文", 80), new Paper("小蓝", "语文", 50) ); papers.stream() .map(Paper::getStudentName) .forEach(System.out::println); // 小明 // 小红 // 小蓝6)anyMatch 如果有一个元素匹配,返回true List<String> list = Arrays.asList("A", "B", "C"); list.stream() .map(s -> { System.out.print(s); return s; }) .anyMatch(s -> s.startsWith("B")); // true // AB7)allMatch 所有元素匹配 List<String> list = Arrays.asList("A", "B", "C"); list.stream() .map(s -> { System.out.println(s); return s; }) .allMatch(s -> s.startsWith("B")); // false // A8)nonMatch 所有元素不匹配 List<String> list = Arrays.asList("A", "B", "C"); list.stream() .map(s -> { System.out.println(s); return s; }) .noneMatch(s -> s.startsWith("B")); // false // A 2、终端操作 (1)collect 收集 List<Paper> papers = Arrays.asList( new Paper("小明", "语文", 40), new Paper("小明", "数学", 80), new Paper("小红", "语文", 80), new Paper("小红", "数学", 80), new Paper("小蓝", "语文", 50), new Paper("小蓝", "数学", 60) ); // 将元素收集成一个List 所有语文卷子 List<Paper> chinesePapers = papers.stream() .filter(p -> p.getClassName().equals("语文")) .collect(toList()); // 将元素收集成一个Set 所有学科 Set<String> classNames = papers.stream() .map(Paper::getClassName) .collect(toSet()); // 统计元素数量 Set<String> classNames = papers.stream() .map(Paper::getClassName) .collect(counting()); // 最高分的卷子,最低分改成minBy就行 Paper maxScorePaper = papers.stream() .collect(maxBy((p1, p2) -> p1.getScore() - p2.getScore())).get(); // 总分数 int sumScore = papers.stream() .collect(summingInt(Paper::getScore)); // 平均分 double avgScore = papers.stream() .collect(averagingInt(Paper::getScore)); // 统计数、总和、最大值、最小值和平均值 IntSummaryStatistics summaryStatistics = papers.stream() .collect(summarizingInt(Paper::getScore)); long count = summaryStatistics.getCount(); long sum = summaryStatistics.getSum(); int max = summaryStatistics.getMax(); int min = summaryStatistics.getMin(); double avg = summaryStatistics.getAverage(); // 学生名字连接在一起 String studentNameStr = papers.stream() .map(Paper::getStudentName) .distinct() .collect(joining(",")); // 按学科将卷子分组 Map<String, List<Paper>> groupPapers = papers.stream() .collect(groupingBy(Paper::getClassName));
    Processed: 0.015, SQL: 9