Stream流作用
简化集合、数组操作的API。结合了Lambda表达式。
Stream思想与使用步骤
a.先得到集合或者数组的Stream流(就是一根传送带)。
b.把元素放上去。
c.然后就用这个Stream流简化的API来方便的操作元素。
集合与数组获取Stream流方式
示例代码
package stream.exception.log.d2_stream;
import java.util.*;
import java.util.stream.Stream;
public class StreamDemo1 {
public static void main(String[] args) {
//Collection集合获取流
Collection<String> list=new ArrayList<>();
Stream<String> s=list.stream();
//Map集合获取流
Map<String, Integer> maps=new HashMap<>();
//键流
Stream<String> keyStream=maps.keySet().stream();
//值流
Stream<Integer> valueStream=maps.values().stream();
//键值对流
Stream<Map.Entry<String, Integer>> keyAndValueStream=maps.entrySet().stream();
//数组获取流
String[] names={"张三","李四","王五","赵六"};
Stream<String> nameStream=Arrays.stream(names);//方法一
Stream<String> nameStream2= Stream.of(names);//方法二
}
}
Stream流常用API
示例代码
StreamDemo3类(实现类)
package stream.exception.log.d2_stream;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Stream;
/**
Stream流常用API
*/
public class StreamDemo2 {
public static void main(String[] args) {
List<String> lists=new ArrayList<>();
lists.add("张三");
lists.add("李四");
lists.add("王五");
lists.add("张六");
lists.add("张七");
lists.add("周八");
//过滤元素,做数据判断。 filter方法 源码:Stream<T> filter(Predicate<? super T> predicate);
lists.stream().filter(new Predicate<String>() {
@Override
public boolean test(String s) {
return s.startsWith("张");//判断名字是否有张,并返回true
}
});
//简化
lists.stream().filter( s-> s.startsWith("张")).forEach(s -> System.out.println(s)); //判断名字是否有张,并返回true
//count统计个数
long size=lists.stream().filter(s->s.length()==2).count();
System.out.println(size);
//获取前两个元素,limit方法
lists.stream().filter(s->s.startsWith("张")).limit(2).forEach(System.out::println);
//跳过前几个元素,skip方法
lists.stream().filter(s->s.startsWith("张")).skip(2).forEach(System.out::println);
//map加工方法:第一个参数原材料->第二个参数时加工后的结果
//给集合元素都加上一个:翻斗幼儿园
lists.stream().map(s -> "翻斗幼儿园:" +s).forEach(System.out::println);
//需求:将所有名称,都加工成一个学生类对象
lists.stream().map(s -> new Student(s)).forEach(System.out::println);
//合并流,concat方法
Stream<String> s1=lists.stream().filter(s->s.startsWith("张"));
Stream<String> s2=Stream.of("Java1","Java2");
Stream<String> s3=Stream.concat(s1,s2);
s3.forEach(System.out::println);
}
}
Stuent类(学生类)
package stream.exception.log.d2_stream;
public class Student {
private String name;
public Student(){};
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
'}';
}
}
收集Stream流到集合或数组中
示例代码
package stream.exception.log.d2_stream;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
收集Stream流到集合或数组中
*/
public class StreamDemo3 {
public static void main(String[] args) {
List<String> lists=new ArrayList<>();
lists.add("张三");
lists.add("李四");
lists.add("王五");
lists.add("张六");
lists.add("张七");
lists.add("周八");
Stream<String> s1=lists.stream().filter(s->s.startsWith("张"));
//将Stream流收集到List集合中
// List<String> zhangList = s1.collect(Collectors.toList());
// System.out.println(zhangList);
//注意:流只能使用一次
//将Stream流收集到Set集合中
// Set<String> zhangSet = s1.collect(Collectors.toSet());
// System.out.println(zhangSet);
//将Stream流收集到数组
Object[] arrs= s1.toArray();
System.out.println("Arrays数组内容:"+Arrays.toString(arrs));
}
}