Java 8通过引入一些函数式编程的概念,改变了我们通常在Java中的编码方式。它带来了像lambda表达式和流这样的功能,这些功能产生了新的模式,使Java中的代码更加简洁。在这篇博客中,我们将讨论Java 8的一个功能,即流。java.util.stream包包含了支持对流进行函数式操作的类,如map、filter等。流不是一个存储东西的数据结构,而是一种将数据从源头流向目的地的方式,中间有一些中间操作。让我们先举个例子,这样我们就能快速掌握概念了。

比方说,我们有一个书的集合Collection,其中Book类有两个属性writer和price,我们想获得price的总和,其中writer是 "Deepak kumar"。为了得到这个结果,我们需要做一些类似于--的事情:
int totalPrice = collection.stream()
.filter(b -> b.getWriter() == "Deepak kumar")
.map(b -> b.getPrice())
.sum();
流是一系列的操作,可以是中间操作或终端操作:
- 中间操作返回一个新的流作为结果,我们可以一个接一个地调用多个中间操作。中间操作在终端操作之前执行。这些类型的操作在本质上总是懒惰的,意味着它们不会被执行,直到需要处理的结果。
- 终端操作允许我们从剩余的数据中产生一个最终结果。在流上应用这个操作后,意味着流已经消耗了。当终端操作启动时,流管道上的计算就会被执行。
Lambda的属性
- 它的功能性意味着如果我们在一些数据上应用流,得到一些结果,这并不意味着它将修改源,相反,它将从现有的流创建一个新流。
- 中间的操作总是懒惰的。
- 在流的生命周期内,流的元素只被访问一次。
流的创建
private static Book[] arrayOfBook = {
new Book("Ravi sharma", 100.0),
new Book("Deepak kumar", 240.0),
new Book("Amit Tyagi", 343.0),
new Book("Chirag Gupta", 143.0)
};
Stream.of(arrayOfBook);
我们也可以直接使用stream()方法来从列表中转换为流:
private static List<Book> bookList = Arrays.asList(arrayOfBook);
empList.stream();
流的操作
- filter: 它产生一个新的流,包含通过谓词的元素,即
Integer[] bookPrice = { 100, 200, 300, 44 };
List<Integer> totalPrice = Stream.of(bookPrice)
.filter(e -> e >= 200)
.collect(Collectors.toList());
结果 - { 200, 300 }
- map:它产生一个新的流,其中包含通过谓词的元素。它在对原始流的每个元素应用一个函数后产生一个新的流。
List number = Arrays.asList(2,3,4,5)
.stream()
.map(s->s+s)
.collect(Collectors.toList());
结果。{ 4, 6, 8, 10 }
- forEach。 它是最简单的操作,看起来和map一样,但它是一个终端操作,这意味着应用这个操作后,我们不能使用任何其他操作。
- flatMap: 它是flat和map函数的组合。
List<List<Integer>> listOfList = Arrays.asList(
Arrays.asList(1,2,3),
Arrays.asList(4,2),
Arrays.asList(1,3));
List<Integer> list = listOfList.stream()
.flatMap(list -> list.stream())
.collect(Collectors.toList());
结果 : { 1, 2, 3, 4, 2, 1, 3 }
- collect: collect函数是一个终端操作,将流转换为一些其他的集合或实体,即在本例中我们将把流转换为列表。
List<Integer> IntSet = Stream.of(1,2,3,4,5)
.map(x -> x+1)
.collect(Collectors.toList());
结果:List(2, 3, 4, 5, 6 )

