java8 Stream API和I/O流是不一样的,它是操作集合元素的API,专注于对集合对象进行各种非常便利、高效的聚合操作
操作的时候,会把集合转成Stream,在stream中对集合进行过滤(filter),遍历操作(map),排序(sorted)等操作
学习 stream,最好把Lambda 和方法引用学习下;
自己只是根据ibm 社区 练习了 一下
代码体现:
package com.xiaodu.java8Stream;
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Optional;
import java.util.Random;
import java.util.concurrent.SynchronousQueue;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import org.junit.Test;
/**
* 测试java8 Stream
* 使用Stream 对集合进行操作
* 使用stream会大量使用lambda 和方法引用
*
*/
public class TestJava8Stream {
/**
* 使用forEach 遍历
* forEach 是terminal 操作,也就是流的末尾操作,操作完就关闭流了 ,所以输出后不能进行其他操作了
*/
@Test
public void TestStreamForEach() {
// 创建集合
List<String> list = Arrays.asList("a","b","c","d","ef");
// 备注:(System.out::print) 是实例方法引用
list.stream().forEach(System.out::print);
/*
* 使用peek 遍历输出 peek是intermediate 操作,是在流中间片段进行操作的,不会涉及到关流,
* 所以还能再流中,对元素进行操作
*/
List<String> collect =
list.stream().peek(System.out::println)
.map(l -> l+l).collect(Collectors.toList());
System.out.println(collect);
}
/**
* 使用map 遍历元素 对每个元素进行操作
*/
@Test
public void TestStreamMap() {
// 创建集合
List<String> list = Arrays.asList("aaa","bbb","ccc","dd","ef");
// 截取字符串
List<String> collect = list.stream().map(a -> a.substring(0, 2)).collect(Collectors.toList());
System.out.println(collect); // [aa, bb, cc, dd, ef]
// 转换为大写
List<String> collect2 = list.stream().map(a -> a.toUpperCase()).collect(Collectors.toList());
System.out.println(collect2);// [AAA, BBB, CCC, DD, EF]
// 使用flatMap 对多个集合进行操作
List<Integer> collect3 =
Stream.of(Arrays.asList(1,2,3),Arrays.asList(7,8,9))
.flatMap(a -> a.stream()).collect(Collectors.toList());
System.out.println(collect3);
}
/**
* 使用filter 进行集合的过滤
*/
@Test
public void TestStreamFilter() {
List<Integer> list = Arrays.asList(1,2,5,4,7,6);
// 求偶
List<Integer> collect = list.stream().filter(a -> a%2==0).collect(Collectors.toList());
System.out.println(collect); //[2, 4, 6]
// 求大于3 的值
List<Integer> collect2 = list.stream().filter(a -> a>3).collect(Collectors.toList());
System.out.println(collect2);//[5, 4, 7, 6]
//
List<String> strs = Arrays.asList("aaa","bbb","ccc","dd","ef");
// 获取指定字符串长度的值
List<String> collect3 = strs.stream().filter(str -> str.length()>2).collect(Collectors.toList());
System.out.println(collect3); // [aaa, bbb, ccc]
}
/**
* 聚合操作
*/
@Test
public void TestStreamAggregation() {
List<Integer> list = Arrays.asList(1,2,5,4,7,6);
IntSummaryStatistics intStream =
list.stream().mapToInt(l -> l).summaryStatistics();
System.out.println("集合 求和 = " +intStream.getSum());
System.out.println("集合平均数= " + intStream.getAverage());
System.out.println("集合元素个数= " + intStream.getCount());
System.out.println("集合最大值= " + intStream.getMax());
System.out.println("集合最小值= " + intStream.getMin());
// 排序
List<Integer> sort = list.stream().sorted().collect(Collectors.toList());
System.out.println(sort); //[1, 2, 4, 5, 6, 7]
// 倒序
List<Integer> desc = list.stream().sorted((a,b) -> -1).collect(Collectors.toList());
System.out.println(desc);
}
/**
* limit skip distinct
*/
@Test
public void TestStreamLimit() {
List<Integer> list = Arrays.asList(1,2,5,4,7,6);
// 获取下坐标小于3 的值
List<Integer> collect = list.stream().limit(3).collect(Collectors.toList());
System.out.println(collect); //[1, 2, 5]
// 获取下坐标大于等于4的值
List<Integer> collect2 = list.stream().skip(4).collect(Collectors.toList());
System.out.println(collect2);//[7, 6]
// 去重
List<String> strs = Arrays.asList("e","c","c","","","a","a");
List<String> collect3 = strs.stream().sorted().distinct().collect(Collectors.toList());
System.out.println(collect3); //[, a, c, e]
}
/**
* reduce 归纳
*/
@Test
public void TestStreamReduce() {
List<Integer> list = Arrays.asList(1,2,5,4,7,6,-2);
// 求和
System.out.println(list.stream().reduce(Integer::sum));
// 求最大值
System.out.println(list.stream().reduce(Integer::max));
// 求最小值
System.out.println(list.stream().reduce(Integer::min));
}
/**
* Match
* -anyMatch 有一个匹配就返回true
* -allMatch 全部匹配才返回true
* -noneMatch 全部不匹配返回true
*/
@Test
public void TestStreamMatch() {
List<String> list = Arrays.asList("小明","小红","天天","12345");
// 集合中是否有一个叫天天的
boolean anyMatch = list.stream().anyMatch(str -> str.equals("天天"));
System.out.println(anyMatch); //true
// 集合长度大于5的
System.out.println(list.stream().allMatch(str -> str.length()>5)); // false
// 判断集合中是否有""
System.out.println(list.stream().noneMatch(str -> str.length()==6));
}
/**
* iterate
* 注意iterate 必须结合limit 使用
*/
@Test
public void TestStreamIterate() {
// 获取等差 集合
List<Integer> collect = Stream.iterate(0, i -> i+2).limit(5).collect(Collectors.toList());
System.out.println(collect);//[0, 2, 4, 6, 8]
}
}
imb链接
Streams 的背景,以及 Java 8 中的使用详解:https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/