(1)Stream流
配合Lambda表达式,简化集合和数组的操作
(2)Stream流思想
流水线思想
(1)集合获取流Stream流对象
使用Collection接口中的默认方法Stream<T> stream()
注:单值集合可以直接获取Stream流对象,键值对象是间接获取Stream流对象
//单值集合获取Stream流对象
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.stream().forEach(s -> System.out.println(s));
//键值集合获取Stream流对象
Map<String, String> map = new HashMap<>();
map.put("a", "1");
map.put("b", "2");
map.keySet().stream().forEach(s -> System.out.println(s));
map.values().stream().forEach(s -> System.out.println(s));
map.entrySet().stream().forEach(s -> System.out.println(s));
(2)数组获取Stream流对象
使用Arrays数组工具类中的静态方法Stream<T> stream(T[] array)
int[] arr = new int[]{1, 2, 3, 4, 5};
Arrays.stream(arr).forEach(s -> System.out.println(s));
(3)零散的数据获取Stream流对象
使用Stream类中的静态方法Stream<T> of(T… values)
Stream.of("a", "b", 9, "d", 3).forEach(s -> System.out.println(s));
注:流对象已经被使用过,就不允许再次使用了;Stream流操作,不会修改源数据
(1)Stream<T> filter(Predicate<? super T> predicate)
用于对流中的数据进行过滤
//打印集合中以"张"开头的字符串
ArrayList<String> list = new ArrayList<>();
list.add("王一");
list.add("张二");
list.add("张三");
list.add("李四");
list.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.println(s));
(2)Stream<T> limit(long maxSize)
获取前几个元素
list.stream().limit(3).forEach(s -> System.out.println(s));
(3)Stream<T> skip(long n)
跳过前几个元素
list.stream().skip(2).forEach(s -> System.out.println(s));
(4)Stream<T> distinct()
去除流中重复的元素(依赖hashCode和equals方法)
Stream<? extends Serializable> stream = Stream.of("s", "s", 3, "d", 3);
stream.distinct().forEach(s -> System.out.println(s));
(5)Stream<T> concat(Stream a,Stream b)
合并a和b两个流为一个流
Stream<Integer> stream1 = Stream.of(1, 2, 3, 4, 5);
Stream<? extends Serializable> stream2 = Stream.of("s", "s", 9, "d", 3);
Stream.concat(stream1, stream2).forEach(s -> System.out.println(s));
(1)void forEach(Consumer action)
对此流的每个元素执行遍历操作
(2)long count()
返回此流中的元素数
(1)R collect(Collector collector)
开始收集Stream流,指定收集器,把Stream流操作后的结果数据转回到集合
(2)Collectors工具类提供了具体的收集方式
Stream<String> sa = Stream.of("sa", "sc", "sd", "d");
List<String> list = sa.filter(s -> s.startsWith("s")).collect(Collectors.toList());
Stream<String> sa = Stream.of("sa", "sc", "sd", "d");
Set<String> set = sa.filter(s -> s.startsWith("s")).collect(Collectors.toSet());
ArrayList<String> list = new ArrayList<>();
list.add("张三,23");
list.add("李四,24");
list.add("王五,25");
list.add("赵六,26");
list.stream().filter(s -> Integer.parseInt(s.split(",")[1]) > 24)
.collect(Collectors.toMap(s-> s.split(",")[0], s -> s.split(",")[1]))
.forEach((k, v) -> System.out.println(k + " " + v));