明天要讲的Stream指的是java.util.stream包中的诸多类。Stream能够不便的将之前的联合类以转换为Stream并以流式形式进行解决,大大的简化了咱们的编程,Stream包中,最外围的就是interface Stream<T>
从下面的图中咱们能够看到Stream继承自BaseStream。Stream中定义了很多十分实用的办法,比方filter,map,flatmap,forEach,reduce,collect等等。接下来咱们将会逐个解说。
创立Stream
Stream的创立有很多形式,java引入Stream之后所有的汇合类都增加了一个stream()办法,通过这个办法能够间接失去其对应的Stream。也能够通过Stream.of办法来创立:
//Stream Creation String[] arr = new String[]{"a", "b", "c"}; Stream<String> stream = Arrays.stream(arr); stream = Stream.of("a", "b", "c");
Streams多线程
如果咱们想应用多线程来解决汇合类的数据,Stream提供了十分不便的多线程办法parallelStream():
//Multi-threading List<String> list =new ArrayList(); list.add("aaa"); list.add("bbb"); list.add("abc"); list.add("ccc"); list.add("ddd"); list.parallelStream().forEach(element -> doPrint(element));
Stream的基本操作
Stream的操作能够分为两类,一类是两头操作,两头操作返回Stream<T>,因而能够级联调用。 另一类是终止操作,这类操作会返回Stream定义的类型。
//Operations long count = list.stream().distinct().count();
下面的例子中,distinct()返回一个Stream,所以能够级联操作,最初的count()是一个终止操作,返回最初的值。
Matching
Stream提供了anyMatch(), allMatch(), noneMatch()这三种match形式,咱们看下怎么应用:
//Matching boolean isValid = list.stream().anyMatch(element -> element.contains("h")); boolean isValidOne = list.stream().allMatch(element -> element.contains("h")); boolean isValidTwo = list.stream().noneMatch(element -> element.contains("h"));
Filtering
filter() 办法容许咱们对Stream中的数据进行过滤,从而失去咱们须要的:
Stream<String> filterStream = list.stream().filter(element -> element.contains("d"));
下面的例子中咱们从list中选出了蕴含“d”字母的String。
Mapping
map就是对Stream中的值进行再加工,而后将加工过后的值作为新的Stream返回。
//Mapping Stream<String> mappingStream = list.stream().map(element -> convertElement(element)); private static String convertElement(String element) { return "element"+"abc"; }
上的例子中咱们把list中的每个值都加上了“abc”而后返回一个新的Stream。
FlatMap
flatMap和Map很相似,然而他们两个又有不同,看名字咱们能够看到flatMap意思是打平之后再做Map。
怎么了解呢?
如果咱们有一个CustBook类:
@Datapublic class CustBook { List<String> bookName;}
CustBook定义了一个bookName字段。
先看一下Map返回的后果:
List<CustBook> users = new ArrayList<>(); users.add(new CustBook());Stream<Stream<String>> userStreamMap = users.stream().map(user -> user.getBookName().stream());
在下面的代码中,map将每一个user都转换成了stream,所以最初的后果是返回Stream的Stream。
如果咱们只想返回String,则能够应用FlatMap:
List<CustBook> users = new ArrayList<>(); users.add(new CustBook()); Stream<String> userStream = users.stream().map(user -> user.getBookName().stream());
简略点讲FlatMap就是将层级关系铺平重来。
Reduction
应用reduce() 办法能够不便的对汇合的数据进行运算,reduce()接管两个参数,第一个是开始值,前面是一个函数示意累计。
//Reduction List<Integer> integers = Arrays.asList(1, 1, 1); Integer reduced = integers.stream().reduce(100, (a, b) -> a + b);
下面的例子咱们定义了3个1的list,而后调用reduce(100, (a, b) -> a + b)办法,最初的后果是103.
Collecting
collect()办法能够不便的将Stream再次转换为汇合类,不便解决和展现:
List<String> resultList = list.stream().map(element -> element.toUpperCase()).collect(Collectors.toList());