今天是高考的日子,是大四师兄师姐答辩毕业的日子。一代又来,一代又去。好久没写博客,借此特殊日子整理一下前不久学java8新特性时写的代码,留下痕迹。(本博客的代码根据 java8新特性教程 学习整理,加上个人的理解而成,关于某个新特性的介绍代码里的注释已经阐述清楚,故不再写文字介绍,直接看代码吧!)
本篇介绍java8的新特性之一:流接口Streams。
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import org.junit.Test;
/**
* 流接口(Streams)
java.util.Stream代表着一串你可以在其上进行多种操作的元素。流操作既可以是连续的也可以是中断的。
中断操作返回操作结果。而连续操作返回流本身,这样你就可以在该行上链式方法调用。
流是创建在数据源上的,例如:java.util.Collection、list集合和set集合(Map不支持)。流操作既可以顺序执行也可以并行执行。
我们首先了解下顺序的流是如何工作的。我们首先创建一个字符串链表。
*/
public class StreamDemo {
static List<String> stringCollection = new ArrayList<>();
static{
stringCollection.add("ddd2");
stringCollection.add("aaa2");
stringCollection.add("bbb1");
stringCollection.add("aaa1");
stringCollection.add("bbb3");
stringCollection.add("ccc");
stringCollection.add("bbb2");
stringCollection.add("ddd1");
}
//Java8的Collections类已经被扩展了,你可以简单的调用Collection.stream()或者Collection.parallelSteam()来创建流。
//下面部分将介绍大部分流操作。
/**
* Filter接受一个predicate来过滤流中的所有元素。这个操作是连续的,它可以让我们在结果上继续调用另外一个流操作forEach。
* ForEach接受一个consumer,它被用来对过滤流中的每个元素执行操作。ForEach是一个中断操作.
* forEach返回void,因此我们不能在ForEach后调用其他流操作。
*/
@Test
public void Filter(){
stringCollection
.stream()
.filter( (s) ->s.startsWith("a") )
.forEach(System.out::println);
// "aaa2" , "aaa1"
}
/**
* Sorted is an intermediate operation which returns a sorted view of the stream.
* The elements are sorted in natural order unless you pass a custom Comparator.
*/
@Test
public void Sorted(){
stringCollection
.stream()
.sorted()
.filter( (s) -> s.startsWith("a") )
.forEach(System.out::println);
// "aaa1" , "aaa2"
//Keep in mind that sorted does only create a sorted view of the stream
//without manipulating the ordering of the backed collection.
//The ordering of stringCollection is untouched:
System.out.println(stringCollection); //[ddd2, aaa2, bbb1, aaa1, bbb3, ccc, bbb2, ddd1]
}
/**
* Map
连续性操作map通过指定的Function将流中的每个元素转变为另外的对象。
下面的示例将每个字符串转换为大写的字符串。
此外,你也可以使用map将每个元素的类型改变为其它类型。
转换后流的泛型类型依赖于你传入的Function的泛型类型。
*/
@Test
public void Map(){
stringCollection
.stream()
.map(String::toUpperCase)
.sorted( (a, b) -> b.compareTo(a))
.forEach(System.out::print);
// // "DDD2", "DDD1", "CCC", "BBB3", "BBB2", "AAA2", "AAA1"
}
/**
* 各种匹配操作可以用来检测某种predicate是否和流中元素相匹配。所有的这些操作是中断的并返回一个boolean结果。
*/
@Test
public void Match(){
boolean anyStartWithA =
stringCollection.stream().anyMatch((s) -> s.startsWith("a"));
System.err.println(anyStartWithA); // true
boolean allStartWithA =
stringCollection.stream().allMatch((s)->s.startsWith("a"));
System.err.println(allStartWithA); // false
boolean noneStartWithA =
stringCollection.stream().noneMatch((s) -> s.startsWith("z"));
System.err.println(noneStartWithA); // true
}
/**
* Count
Count是中断型操作,它返回流中的元素数量。
*/
@Test
public void Count(){
long startWithB =
stringCollection
.stream()
.filter((s)->s.startsWith("b"))
.count();
System.err.println(startWithB); // 3
}
/**
* Reduce
* 这个中断性操作使用指定的function对流中元素实施消减策略。此操作的返回值是一个包括所有被消减元素的Optional。
*/
@Test
public void Reduce(){
Optional<String> optional =
stringCollection
.stream()
.sorted()
.reduce((s1, s2)->s1+"#"+s2 );
optional.ifPresent(System.out::print);
// aaa1#aaa2#bbb1#bbb2#bbb3#ccc#ddd1#ddd2
}
}
详情请见这篇博客:
java8新特性教程