与java.io包里的InputStream和OutputStream是完全不同的概念,它是以数据流的形式来处理数据集合。
- 不是collection,有点儿像iterator但没有存储
- 仅代表数据流,并没有数据结构
- 只能被遍历一次(返回另外一个Stream)。采用Lazy方式,如果有多个中间操作和最终操作,在调用最终操作的时候才会同时处理所有中间操作。
- 不支持索引访问
- 避免出现Null而影响到链式操作,引入了Optional.empty代表空。
- 短路处理:只要有一个符合条件就终止遍历。善用短路处理也能提高效率,比如:stream.count() != 0 等价于 stream.findAny().isPresent()
Streams vs. Collections: What’s the difference?
两种模式
- 顺序流sequential version
- 并行流parallel version
***可以相互转换!
两种操作
- 中间操作Intermediate operation
- 终止操作Terminal operation
Stream类型
- Stream<T>
- IntStream、LongStream、DoubleStream
链式写法
数据源(集合、数组等).中间操作(过滤、投影等).....终止操作(forEach、reduce等)
***可以没有中间操作。
一个简单的例子
List<String> apples = fruits.stream()
.filter(f -> f.getName().startsWith("Apple"))
.filter(f -> f.getPrice() > 10)
.sorted(Comparator.comparingInt(Fruit::getPrice))
.map(Fruit:getName)
.collect(Collectors.toList());
// Line 1:从所有水果一览中
// Line 2:把名字以“Apple”开头
// Line 3:价格高于10元的
// Line 4:按照价格升序排序
// Line 5:并只取出名字
// Line 6:的水果一览List
生成Stream
// Values
Stream<String> stream1 = Stream.of("a", "b", "c", "d", "e");
// Array
Object[] array = {"string", 1, new ArrayList<Integer>()};
Stream<Object> stream2 = Arrays.stream(array);
Stream<Object> stream3 = Stream.of(array);
// Collection
List<String> list = Arrays.asList("a", "b", "c", "d", "e");
Stream<String> stream4 = list.stream();// sequential version
Stream<String> stream5 = list.parallelStream(); // parallel version
// Function
Stream<String> stream6 = Stream.generate(() -> "test").limit(5);
Stream<Integer> stream7 = Stream.iterate(10, i -> i + 10).limit(5);
// Stream.Builder
Stream.Builder<String> builder = Stream.builder();
builder.accept("foo");
builder.add("bar");
Stream<String> stream8 = builder.build();
// String
IntStream stream9 = "abcd".chars();
// Random
Random random = new Random();
IntStream stream10 = random.ints();
// Iterable
Iterable<String> iter = Arrays.asList("a", "b", "c", "d", "e");
Stream<String> stream11 = StreamSupport.stream(iter.spliterator(), false);
// Stream + Stream
Stream<String> a = Stream.of("a", "b", "c");
Stream<String> b = Stream.of("d", "e");
Stream<String> stream12 = Stream.concat(a, b);
// Range Stream
IntStream stream13 = IntStream.range(2, 10);
// BufferedReader
FileReader fr = new FileReader("test.txt");
BufferedReader br = new BufferedReader(fr);
Stream<String> stream14 = br.lines();
核心方法
过滤
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
.filter(x -> x % 2 == 0);
投影
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
.map(x -> x * 10);
一对多投影
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
.flatMap(x -> IntStream.range(x * 10, x * 10 + x).boxed());
排序
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
.sorted((x, y) -> y - x);
获取前N个元素
Stream.iterate(1, x-> x++)
.limit(5);
跳过前N个元素
Stream.iterate(1, x-> x++)
.skip(3)
.limit(5);
连接
Stream.concat( Arrays.asList(1,2,3).stream(),
Arrays.asList(30,20,10).stream());
无重复
Arrays.asList(1,3,4,3,2,4).stream()
.distinct();
自定义方法
int max = Arrays.asList(1,5,3,7,2,4).stream()
.reduce(Integer.MIN_VALUE, (x, y) -> Math.max(x, y));
System.out.println(max);
分组
Arrays.asList("Sam", "Samuel", "Samu", "Ravi", "Ratna","Barsha").stream()
.collect(Collectors.groupingBy(x -> x.length()))
.entrySet().stream();
平均值
IntStream.range(0, 10).average().getAsDouble();
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
.collect(Collectors.summarizingInt(x -> x))
.getAverage();
件数
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
.count();
最大值
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
.max();
最小值
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
.min();
合计
IntStream.range(0, 10).sum();
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
.collect(Collectors.summarizingInt(x -> x))
.getSum();
第一个元素
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
.findFirst();
找到任何一个匹配的元素
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
.findAny();
导出到某个容器
List<String> converted = Arrays.asList("foo", "foo bar").stream()
.collect(Collectors.toList());
导出到数组
int[] arr = new Random().ints().limit(10).toArray();
是否所有的元素都匹配
boolean a = Arrays.asList(1, 3, 5, 7, 9).stream()
.allMatch(c -> c % 3 == 0);
是否至少一个匹配的元素
boolean b = Arrays.asList(1, 3, 5, 7, 9).stream()
.anyMatch(c -> c % 3 == 0);
是否所有的元素都不匹配
boolean c = Arrays.asList("foo", "foo bar").stream()
.noneMatch(s -> s.startsWith("A"));
空序列
Stream.empty();
指定范围的序列
IntStream.range(0, 10);
通过函数生成
Stream.generate(() -> "test").limit(5).forEach(System.out::println);
Stream.generate(new Random()::nextInt).forEach(System.out::println);
无限循环
Stream.iterate(10, i -> i + 10)
.limit(5)
.forEach(System.out::println);
遍历序列
Arrays.asList(0,1,2,3,4,5,6,7,8,9).stream()
.forEach(System.out::println);
http://java-latte.blogspot.jp/2014/03/stream-lambda-in-java-8.html
http://blog.informatech.cr/2013/03/24/java-streams-preview-vs-net-linq/
http://qiita.com/amay077/items/9d2941283c4a5f61f302
- 大小: 27.5 KB
- 大小: 100.9 KB
分享到:
相关推荐
Java8并行流中自定义线程池操作示例 Java8并行流中自定义线程池操作示例主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧。 1. 概览 Java8引入了...
java8中通过stream流对List类型进行一些操作的测试Demo类
- **基本类型的流**:对于int、long和double这些基本类型,Java8提供了专门的Stream实现:`IntStream`、`LongStream`和`DoubleStream`。 ```java IntStream intStream = IntStream.range(0, 10); // 生成0到9的...
Java Stream是Java 8引入的重要特性,它提供了一种声明式处理数据集合的方式,极大地提升了代码的可读性和性能。Stream允许程序员更加专注于业务逻辑,而不是底层数据处理的细节。 **1. Java Stream简介** Java ...
在Java 8中,Stream API引入了一种新的处理数据的方式,它允许我们以声明性风格对集合、数组等数据源进行高效的操作。Stream是数据渠道,它可以用来处理一系列元素,如从集合或数组中生成的元素序列。Stream操作通常...
Stream API作为Java 8的重要特性之一,极大地简化了集合处理的代码编写过程,提升了程序的可读性和效率。 ### Stream概述 Java 8引入的Stream API提供了一种更加高效且易于理解的方式来处理集合中的数据。它可以被...
6. **并行处理的挑战**:Java 8的Stream API支持并行流,可以充分利用多核处理器的优势。在Java 8以下,如果想要实现并行处理,需要手动使用线程池或者并发工具,如`ExecutorService`和`Future`,这无疑增加了编码...
Java 8是Java语言的一个重要版本,引入了许多新特性,其中Stream API是其最显著的改进之一。Stream API提供了一种新的数据处理方式,使得在集合上进行操作更加简洁、高效。本文将深入探讨Java 8 Stream API的基础...
Java的IO流与Stream流是Java程序中处理输入输出的核心技术。IO流主要分为字节流和字符流,这两种流分别处理二进制数据(如图片、音频等)和文本数据(如ASCII、UTF-8编码的文本)。下面将详细阐述这两个流的分类、...
以下将详细介绍Stream流的使用,以及它在Java8中的重要性。 首先,Stream API是一种用于处理集合的新接口,它可以对集合进行各种操作,如过滤、映射、聚合等,而无需显式地遍历集合。这种处理方式称为“函数式编程...
Collectors.toMap()是Java 8 Stream API中一个非常实用的工具,它简化了将流中的元素收集到Map中的过程。通过本文的介绍,你应该能够理解Collectors.toMap()的工作原理,并能够在实际开发中灵活运用它。如果你有任何...
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据
Stream是 Java 8新增加的类,用来补充集合类。 Stream代表数据流,流中的数据元素的数量可能是有限的,也可能是无限的。 Stream和其它集合类的区别在于:其它集合类主要关注与有限数量的数据的访问和有效管理...
在Java 8引入的Stream API中,java.util.stream.Collector接口扮演着至关重要的角色。它不仅丰富了集合处理的方式,还提供了一种声明式的数据转换和汇总方法。本文将详细探讨Collector接口的工作原理、核心方法、...
主要是介绍在 JDK8中使用 stream 流的 groupingBy 方法源进行最大值分组、最小值分组、平均值分组、统计分组
Stream API是Java 8引入的一种处理数据的新概念,它提供了一种声明式编程风格,使得对集合数据进行过滤、映射和规约等操作更为简洁。Stream API可以用于处理任何数据源,如集合、数组、I/O通道甚至数据库查询结果。...
Stream API首次在Java 8中引入,极大地提升了代码的简洁性和可读性。 Java中的Stream分为两种类型:InputStream和OutputStream,分别对应输入流和输出流。InputStream用于读取数据,而OutputStream则用于写入数据。...
Java8新特性Stream流实例详解 Java 8 中引入了 Stream 流,用于操作数据源(集合、数组等)所生成的元素序列。Stream 流是数据渠道,具有声明性、可复合、可并行三个特性,使得 Stream 操作更简洁、更灵活、高效。...
Java Stream 流实现合并操作示例 Java Stream 流实现合并操作示例是 Java Stream Api 的一个重要应用场景。在实际开发中,我们经常需要将多个 Stream 流合并成一个流,以便进行后续的数据处理。今天,我们将详细...