热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java8新增功能详解:StreamAPI流处理技术

Java8引入了StreamAPI,这一新特性极大地增强了集合数据的处理能力。通过StreamAPI,开发者可以更加高效、简洁地进行集合数据的遍历、过滤和转换操作。本文将详细解析StreamAPI的核心概念和常见用法,帮助读者更好地理解和应用这一强大的工具。

java8新特性(4)— Stream流


遍历集合更强大

package com.common.jdk8;import java.util.*;
import java.util.stream.Collectors;//Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
//Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
//Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
//这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
//元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。
public class Jdk8Test4 {//什么是 Stream&#xff1f;//Stream&#xff08;流&#xff09;是一个来自数据源的元素队列并支持聚合//元素是特定类型的对象&#xff0c;形成一个队列。 Java中的Stream并不会存储元素&#xff0c;而是按需计算。//数据源 流的来源。 可以是集合&#xff0c;数组&#xff0c;I/O channel&#xff0c; 产生器generator 等。//聚合操作 类似SQL语句一样的操作&#xff0c; 比如filter, map, reduce, find, match, sorted等。//和以前的Collection操作不同&#xff0c; Stream操作还有两个基础的特征&#xff1a;//Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道&#xff0c; 如同流式风格&#xff08;fluent style&#xff09;。 这样做可以对操作进行优化&#xff0c; 比如延迟执行(laziness)和短路( short-circuiting)。//内部迭代&#xff1a; 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代&#xff0c; 这叫做外部迭代。 Stream提供了内部迭代的方式&#xff0c; 通过访问者模式(Visitor)实现。public static void main(String args[]){System.out.println("使用 Java 7: ");// 计算空字符串List<String> strings &#61; Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");System.out.println("列表: " &#43;strings);long count &#61; getCountEmptyStringUsingJava7(strings);System.out.println("空字符数量为: " &#43; count);count &#61; getCountLength3UsingJava7(strings);System.out.println("字符串长度为 3 的数量为: " &#43; count);// 删除空字符串List<String> filtered &#61; deleteEmptyStringsUsingJava7(strings);System.out.println("筛选后的列表: " &#43; filtered);// 删除空字符串&#xff0c;并使用逗号把它们合并起来String mergedString &#61; getMergedStringUsingJava7(strings,", ");System.out.println("合并字符串: " &#43; mergedString);List<Integer> numbers &#61; Arrays.asList(3, 2, 2, 3, 7, 3, 5);// 获取列表元素平方数List<Integer> squaresList &#61; getSquares(numbers);System.out.println("平方数列表: " &#43; squaresList);List<Integer> integers &#61; Arrays.asList(1,2,13,4,15,6,17,8,19);System.out.println("列表: " &#43;integers);System.out.println("列表中最大的数 : " &#43; getMax(integers));System.out.println("列表中最小的数 : " &#43; getMin(integers));System.out.println("所有数之和 : " &#43; getSum(integers));System.out.println("平均数 : " &#43; getAverage(integers));System.out.println("随机数: ");// 输出10个随机数Random random &#61; new Random();for(int i&#61;0; i < 10; i&#43;&#43;){System.out.println(random.nextInt());}System.out.println("使用 Java 8: ");System.out.println("列表: " &#43;strings);count &#61; strings.stream().filter(string->string.isEmpty()).count();System.out.println("空字符串数量为: " &#43; count);count &#61; strings.stream().filter(string -> string.length() &#61;&#61; 3).count();System.out.println("字符串长度为 3 的数量为: " &#43; count);filtered &#61; strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.toList());System.out.println("筛选后的列表: " &#43; filtered);mergedString &#61; strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.joining(", "));System.out.println("合并字符串: " &#43; mergedString);squaresList &#61; numbers.stream().map( i ->i*i).distinct().collect(Collectors.toList());System.out.println("Squares List: " &#43; squaresList);System.out.println("列表: " &#43;integers);IntSummaryStatistics stats &#61; integers.stream().mapToInt((x) ->x).summaryStatistics();System.out.println("列表中最大的数 : " &#43; stats.getMax());System.out.println("列表中最小的数 : " &#43; stats.getMin());System.out.println("所有数之和 : " &#43; stats.getSum());System.out.println("平均数 : " &#43; stats.getAverage());System.out.println("随机数: ");random.ints().limit(10).sorted().forEach(System.out::println);// 并行处理count &#61; strings.parallelStream().filter(string -> string.isEmpty()).count();System.out.println("空字符串的数量为: " &#43; count);}private static int getCountEmptyStringUsingJava7(List<String> strings){int count &#61; 0;for(String string: strings){if(string.isEmpty()){count&#43;&#43;;}}return count;}private static int getCountLength3UsingJava7(List<String> strings){int count &#61; 0;for(String string: strings){if(string.length() &#61;&#61; 3){count&#43;&#43;;}}return count;}private static List<String> deleteEmptyStringsUsingJava7(List<String> strings){List<String> filteredList &#61; new ArrayList<String>();for(String string: strings){if(!string.isEmpty()){filteredList.add(string);}}return filteredList;}private static String getMergedStringUsingJava7(List<String> strings, String separator){StringBuilder stringBuilder &#61; new StringBuilder();for(String string: strings){if(!string.isEmpty()){stringBuilder.append(string);stringBuilder.append(separator);}}String mergedString &#61; stringBuilder.toString();return mergedString.substring(0, mergedString.length()-2);}private static List<Integer> getSquares(List<Integer> numbers){List<Integer> squaresList &#61; new ArrayList<Integer>();for(Integer number: numbers){Integer square &#61; new Integer(number.intValue() * number.intValue());if(!squaresList.contains(square)){squaresList.add(square);}}return squaresList;}private static int getMax(List<Integer> numbers){int max &#61; numbers.get(0);for(int i&#61;1;i < numbers.size();i&#43;&#43;){Integer number &#61; numbers.get(i);if(number.intValue() > max){max &#61; number.intValue();}}return max;}private static int getMin(List<Integer> numbers){int min &#61; numbers.get(0);for(int i&#61;1;i < numbers.size();i&#43;&#43;){Integer number &#61; numbers.get(i);if(number.intValue() < min){min &#61; number.intValue();}}return min;}private static int getSum(List numbers){int sum &#61; (int)(numbers.get(0));for(int i&#61;1;i < numbers.size();i&#43;&#43;){sum &#43;&#61; (int)numbers.get(i);}return sum;}private static int getAverage(List<Integer> numbers){return getSum(numbers) / numbers.size();}
}

运行结果

使用 Java 7:列表: [abc, , bc, efg, abcd, , jkl]空字符数量为: 2字符串长度为 3 的数量为: 3筛选后的列表: [abc, bc, efg, abcd, jkl]合并字符串: abc, bc, efg, abcd, jkl平方数列表: [9, 4, 49, 25]列表: [1, 2, 13, 4, 15, 6, 17, 8, 19]列表中最大的数 : 19列表中最小的数 : 1所有数之和 : 85平均数 : 9随机数:-8845067758448462981181770977-268099100-20767820571256561986802112096-859138137-194403122-1546201209使用 Java 8:列表: [abc, , bc, efg, abcd, , jkl]空字符串数量为: 2字符串长度为 3 的数量为: 3筛选后的列表: [abc, bc, efg, abcd, jkl]合并字符串: abc, bc, efg, abcd, jklSquares List: [9, 4, 49, 25]列表: [1, 2, 13, 4, 15, 6, 17, 8, 19]列表中最大的数 : 19列表中最小的数 : 1所有数之和 : 85平均数 : 9.444444444444445随机数:-1118525426-847572210-632355909-447013487-1523942166699336748595529656337063410283633211283705449空字符串的数量为: 2

推荐阅读
author-avatar
ian
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有