惰性求值
多个中间操作可以连接起来行程一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为“惰性求值”
筛选与切片
filter(Predicate p)—接收lambda,从流中排除某些元素
//filter(Predicate p)----接收Lambda,从流中排除某些元素
//内部迭代:迭代操作由StrameAPI来完成
@Test
public void test2(){
Stream<Employee> stream = list.stream().filter((e) ->{
System.out.println("StreamApi的中间操作");
return e.getAge() > 35;
});
//终止操作
stream.forEach(System.out::println);
}
//外部迭代
@Test
public void test3(){
Iterator<Employee> iter = list.iterator();
while (true){
System.out.println(iter.next());
}
}
limit—截断流,使其元素不超过给定数量
//limit----截断流,使其元素不超过给定数量
@Test
public void test4(){
list.stream().filter((x) -> {
System.out.println("短路");
return x.getSalary()>5000;
})
.limit(2)
.forEach(System.out::println);
/**
* 短路
Employee{name='张三', age=18, salary=9999}
短路
Employee{name='李四', age=59, salary=6666}
*/
}
skip—跳过元素,返回一个扔掉了前n个元素的流.若流中元素不满 足n个,则返回空流.与limit(n)互补
//skip----跳过元素,返回一个扔掉了前n个元素的流.若流中元素不满足n个,则返回空流.与limit(n)互补
@Test
public void test5(){
list.stream().filter((x) -> x.getSalary()>5000)
.skip(2)
.forEach(System.out::println);
/**
* Employee{name='赵六', age=8, salary=7777}
Employee{name='田七', age=38, salary=5555}
*/
}
distinct—通过流所生成元素的hashcode()和equals()去除重复元素
//distinct----通过流所生成元素的hashcode()和equals()去除重复元素
@Test
public void test6(){
list.stream().filter((x) -> x.getSalary()>5000)
.skip(2)
.distinct().forEach(System.out::println);
}
映射
map—接收lambda,将元素转换成其他形式或提取信息.接收另一 个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个 新元素
//map----接收lambda,将元素转换成其他形式或提取信息.接收另一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新元素
@Test
public void test7(){
List<String> list1 = Arrays.asList("aa","bb","cc","dd");
list1.stream().map((str) -> str.toUpperCase()).forEach(System.out::println);
System.out.println("-----------------------------------------");
// list.stream().map((x) -> x.getName())
// .forEach(System.out::println);
list.stream().map(Employee::getName)//方法引用
.forEach(System.out::println);
System.out.println("-----------------------------------------");
Stream<Stream<Character>> stream2= list1.stream().map(TestStreamAPI1::filterCharacter);
stream2.forEach((sm) ->{
sm.forEach(System.out::println);
});
}
public static Stream<Character> filterCharacter(String str){
List<Character> characters = new ArrayList<>();
for (Character ch: str.toCharArray()) {
characters.add(ch);
}
return characters.stream();
}
flatMap—接收一个函数作为参数,将流中每个值都换成另一个 流,然后把所有流连接成一个流
//flatMap----接收一个函数作为参数,将流中每个值都换成另一个流,然后把所有流连接成一个流
@Test
public void test8(){
List<String> li = Arrays.asList("aa","bb","cc","dd");
Stream<Character> sm = li.stream().flatMap(TestStreamAPI1::filterCharacter);
sm.forEach(System.out::println);
}
public static Stream<Character> filterCharacter(String str){
List<Character> characters = new ArrayList<>();
for (Character ch: str.toCharArray()) {
characters.add(ch);
}
return characters.stream();
}
mapToInt(ToIntFunction f)—接收一个函数作为参数,该函数 会被应用到每个元素上,产生一个新的IntStream
//mapToInt(ToIntFunction f)----接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的IntStream
@Test
public void test9(){
IntStream intStream = list.stream().mapToInt(Employee::getAge);
intStream.forEach(System.out::println);
}
mapToLang(ToLangFunction f)—接收一个函数作为参数,该 函数会被应用到每个元素上,产生一个新的LongStream
//d.mapToLang(ToLangFunction f)----接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的LongStream
@Test
public void test10(){
LongStream longStream = list.stream().mapToLong(Employee::getSalary);
longStream.forEach(System.out::println);
}
mapToDouble(ToDoubleFunction f)—接收一个函数作为参 数,该函数会被应用到每个元素上,产生一个新的DoubleStream
//mapToDouble(ToDoubleFunction f)----接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的DoubleStream
@Test
public void test11(){
DoubleStream doubleStream = list.stream().mapToDouble(Employee::getSalary);
doubleStream.forEach(System.out::println);
//输出结果:9999.0,6666.0,3333.0.....
}
排序
sorted—自然排序
//sorted----自然排序
@Test
public void test12(){
List<String> strList = Arrays.asList("ccc","aaa","ddd","eee","bbb");
strList.stream().sorted().forEach(System.out::println);
}
sorted(Comparator comp)—定制排序
//sorted(Comparator comp)----定制排序
@Test
public void test13(){
list.stream().sorted((e1,e2) ->{
if(e1.getName().equals(e2.getName())){
return e1.getSex().compareTo(e2.getSex());
} else{
return e1.getName().compareTo(e2.getName());
}
}).forEach(System.out::println);
}
