stream例子:
List<String> names = new ArrayList<>();
Collections.addAll(names,"张三1","张三2","李四","王五","赵六");
System.out.println(names);
//使用stream寻找张开头的name并打印到控制台中
names.stream().filter(s -> s.startsWith("张")).forEach(System.out::println);
stream三个操作步骤
- 创建stream
- 中间操作
- 终止操作
filter原理
遍历集合或数组中每个数据,筛选出符合要求的数据。
三种获取流的方式
- Collection集合获取流
Collection<String> list = new ArrayList<>();
Stream<String> array = list.stream();
- map集合获取流
Map<String,Integer> map = new HashMap<>();
//获取所有的键
Stream<String> keys = map.keySet().stream();
//获取所有的值
Stream<Integer> values = map.values().stream();
//获取键值对整体
Stream<Map.Entry<String, Integer>> entries = map.entrySet().stream();
- 数组获取流
String[] name = {"张三1","张三2","李四","王五","赵六"};
Stream<String> name1 = Arrays.stream(name);
Stream<String> name2 = Stream.of(name);
使用map进行加工stream
- 为集合元素添加一个前缀ZZ
- Function第一个参数为传入的数据类型,第二个参数为返回的参数类型
List<String> name = new ArrayList<>(); name.add("张三1");
name.add("张三2");
name.add("李四");
name.add("王五");
name.stream().map(new Function<String, String>() {
@Override
public String apply(String s) {
return "ZZ"+s;
}
}).forEach(System.out::println);
- 因为Function为函数式接口,所以这里可以进行简化
name.stream().map(s->"LL"+s).forEach(System.out::println);
distinct去除流中重复的数据
Arrays.asList(1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 6, 6).stream().distinct().forEach(System.out::println);
//123456
sorted排序
//默认是升序排序
Arrays.asList(1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 6, 6).stream().distinct().sorted().forEach(System.out::print);
//通过lambda修改排序规则
Arrays.asList(1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 6, 6).stream().distinct().sorted(((o1, o2) -> Double.compare(o2,o1))).forEach(System.out::print);
limit(限制流数据个数)、skip(跳过前几个数据)
Arrays.asList(1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 6, 6).stream().skip(3).limit(2).forEach(System.out::print);
//22(跳过前三个数据后取两个数据)
合并数据流
Stream<String> stream1 = name.stream().filter(s -> s.startsWith("张"));
Stream<Integer> stream2 = Stream.of(12, 18, 64);
Stream<Object> concat = Stream.concat(stream1, stream2);
concat.forEach(System.out::println);
Collectors.toList(返回数据流(List))
List<Integer> collect = Arrays.asList(1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 6, 6).stream().filter(x->x>2).collect(Collectors.toList());
count(收集数据的个数)
long count = Arrays.asList(1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 6, 6).stream().filter(x -> x > 2).count();
Collectors.joining(“,”)(返回字符串用,进行分割)
String collect = Stream.of("a","b","asd","llll","xs","w","nn").filter(x -> x.length() > 2).collect(Collectors.joining(","));
toArray(返回数组)
Object[] objects = Stream.of(1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 6, 6).filter(x -> x > 2).toArray();
注
- 中间方法也称为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程
- 在Stream流中无法直接修改集合、数组中的数据