任性的大象 · 天津大学福州国际联合学院2025级研究生招生 ...· 1 周前 · |
苦恼的冲锋衣 · 2023年中国经济社会发展情况及2024年规 ...· 3 周前 · |
淡定的胡萝卜 · 京沪动卧悄然实施浮动票价-新华网· 1 月前 · |
重感情的大象 · 2024深圳中考适应性考试难度系数及分数学校 ...· 2 月前 · |
强健的杨桃 · 到碗里来�% - 搜狗图片搜索· 1 年前 · |
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。
+--------------------+ +------+ +------+ +---+ +-------+ | stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect| +--------------------+ +------+ +------+ +---+ +-------+以上的流程转换为 Java 代码为:
List<Integer> transactionsIds = widgets.stream() .filter(b -> b.getColor() == RED) .sorted((x,y) -> x.getWeight() - y.getWeight()) .mapToInt(Widget::getWeight) .sum();Stream(流)是一个来自数据源的元素队列并支持聚合操作
和以前的Collection操作不同, Stream操作还有两个基础的特征:
在 Java 8 中, 集合接口有两个方法来生成流:
stream() − 为集合创建串行流。
parallelStream() − 为集合创建并行流。
Stream 提供了新的方法 'forEach' 来迭代流中的每个数据。以下代码片段使用 forEach 输出了10个随机数:
map 方法用于映射每个元素到对应的结果,以下代码片段使用 map 输出了元素对应的平方数:
filter 方法用于通过设置的条件过滤出元素。以下代码片段使用 filter 方法过滤出空字符串:
limit 方法用于获取指定数量的流。 以下代码片段使用 limit 方法打印出 10 条数据:
sorted 方法用于对流进行排序。以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序:
parallelStream 是流并行处理程序的代替方法。以下实例我们使用 parallelStream 来输出空字符串的数量:
我们可以很容易的在顺序运行和并行之间切换。
另外,一些产生统计结果的收集器也非常有用。它们主要用于int、double、long等基本类型上,它们可以用来产生类似如下的统计结果。
执行以上脚本,输出结果为:
$ javac Java8Tester.java $ java Java8Tester 使用 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 -393170844 -963842252 447036679 -1043163142 -881079698 221586850 -1101570113 576190039 -1045184578 1647841045 使用 Java 8: 列表: [abc, , bc, efg, abcd, , jkl] 空字符串数量为: 2 字符串长度为 3 的数量为: 3 筛选后的列表: [abc, bc, efg, abcd, jkl] 合并字符串: abc, bc, efg, abcd, jkl Squares List: [9, 4, 49, 25] 列表: [1, 2, 13, 4, 15, 6, 17, 8, 19] 列表中最大的数 : 19 列表中最小的数 : 1 所有数之和 : 85 平均数 : 9.444444444444445 -1743813696 -1301974944 -1299484995 -779981186 136544902 555792023 1243315896 1264920849 1472077135 1706423674 空字符串的数量为: 2 class Main { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); // 获取对应的平方数 // List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList()); List<Integer> squaresList = numbers.stream() .map(i -> i * i) .sorted((x, y) -> y - x) .collect(Collectors.toList()); // squaresList.forEach(System.out::println); squaresList.forEach(num -> { num++; System.out.println(num); List<String> strList = Arrays.asList("a", "ba", "bb", "abc", "cbb", "bba", "cab"); Map<Integer, String> strMap = new HashMap<Integer, String>(); strMap = strList.stream() .collect( Collectors.toMap( str -> strList.indexOf(str), str -> str ) ); strMap.forEach((key, value) -> { System.out.println(key+"::"+value);输出结果为:
1::ba 2::bb 3::abc 4::cbb 5::bba 6::cabhoo
136***6757@qq.com