Stream使用来处理list、array这些集合的新API。链式编程,使用Stream处理代码更简洁。
创建流
steam() : 创建普通流。
parallelStream: 创建并行流。并行流是对流的处理是并行的,不是顺序的。
public List<String> codelist = Arrays.asList("1", "2", "3", "4", "", "5", "6"); public Stream<String> getStream() { return codelist.stream(); } @Test public void paralletTest() { codelist.parallelStream().forEach(System.out::println); }
forEach
strean对象的forEach方法,用于遍历。参数是Consumer接口
void forEach(Consumer<? super T> action);
用法
codelist.parallelStream().forEach(System.out::println);
打印
map
map返回一个新的stream,对每个源元素进行操作处理。参数是function
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
用法
@Test public void mapTest() { getStream().filter((s) -> { return s != null && !"".equals(s); }).map((a) -> { return String.valueOf(Integer.valueOf(a) * 2); }).forEach(System.out::println); }
结果
filter
filter是过滤器,下面是过滤list中的空string的例子。
return stream.filter((s) -> { return s != null && !"".equals(s); }).collect(Collectors.toList());
limit
limit用于获得指定数量的流,参数是long
Stream<T> limit(long maxSize);
下面是获得5位流
getStream().filter((s) -> { return s != null && !"".equals(s); }).limit(5).forEach(System.out::println);
sorted
sorted用于排序,参数Comparator
Stream<T> sorted(Comparator<? super T> comparator);
下面是按值排序的
@Test public void sortTest() { getStream().filter((s) -> { return s != null && !"".equals(s); }).sorted((a, b) -> { return Integer.valueOf(b) - Integer.valueOf(a); }).forEach(System.out::println); }
Collectors
Collecors有许多规约操作,如将流转成list或其他。这里是返回list和字符串。
@Test public void collectTest() { List<String> filterList = getStream().filter((s) -> { return s != null && !"".equals(s); }).collect(Collectors.toList()); System.out.println("filter list : " + filterList); String joinlist = getStream().filter((s) -> { return s != null && !"".equals(s); }).collect(Collectors.joining(",")); System.out.println("joinlist:" + joinlist); }
IntSummaryStatistics
IntSummaryStatistics可以对数字的集合做统计。如常见的最大最小值、平均值、总和。
@Test public void intSummaryStatistics() { List<Integer> numbers = Arrays.asList(1, 3, 5, 7, 9, 11, 13, 15); IntSummaryStatistics stats = numbers.stream().mapToInt((x)->x).summaryStatistics(); System.out.println("最大的数:" + stats.getMax()); System.out.println("最小的数:" + stats.getMin()); System.out.println("和:" + stats.getSum()); System.out.println("数据长度:" + stats.getCount()); System.out.println("平均数:" + stats.getAverage()); }
结果