java stream 流
获取stream流
获取方式 | 方法 |
---|---|
单列集合 | 单列集合的上层接口Collection,直接用 Collection 中的stream方法 |
双列集合 | 需要将双列集合转成单列集合才能使用stream 方法 |
数组 | 使用Arrays工具类中的静态方法 |
一堆零散的数据 | 使用Stream接口中的方法 |
stream 流相当一是 “工厂的流水线 ”
单列集合:
//创建集合 List<String> list = Arrays.asList("张三", "李四", "王五"); // foeEach中的参数原本是要写一个consumer接口, // 但是因为comsumer接口 是 @FunctionalInterface (函数式接口)所以简写成lambada表达式的写法 list.stream().forEach(new Consumer<String>() { @Override public void accept(String s) { // s 参数:代表流里面的每一个数据 -> { 你要每一个数据进行什么样的操作 } //这里也可以理解成遍历集合,s → 是集合里的每一个元素 System.out.println(s); } }); // stream流我们一般喜欢使用 Lambda 表达式的写法 list.stream().forEach(s -> System.out.println(s));
双列集合:
HashMap<String,Integer> map = new HashMap<>(); map.put("张三",18); map.put("李四",20); map.put("王五",30); // keyset → map中的键 map.keySet().stream().forEach(s -> System.out.println(s)); //entrySet → map中的键值对象 map.entrySet().stream().forEach(s-> System.out.println(s));
数组:
int[] arr = {1,23,56,33}; Arrays.stream(arr).forEach(s -> System.out.println(s));
零散数据:
Stream.of("s",1,"555").forEach(s -> System.out.println(s));
stream流的中间方法
方法名 | 说明 |
---|---|
filter | 过滤 |
limit | 获取前几个元素 |
skip | 跳过前几个元素 |
distinct | 元素去重(依赖hashCode和equals方法) |
map | 转换流中的数据类型 |
filter
List<String> list = Arrays.asList("张三", "李四", "王五", "张思"); // 过滤掉不姓张的人 list.stream().filter(new Predicate<String>() { @Override public boolean test(String s) { boolean result = s.startsWith("张"); //return true 要留下来的数据 //return false 要过滤掉的数据 return result; } }).forEach(s -> System.out.println(s)); list.stream().filter(s->s.startsWith("张")).forEach(s -> System.out.println(s));
limit
List<String> list = Arrays.asList("张三", "李四", "王五", "张思"); // //获取前几个元素 和索引无关 list.stream().limit(2).forEach(s -> System.out.println(s));
skip
List<String> list = Arrays.asList("张三", "李四", "王五", "张思"); // //跳过第几个元素 和索引无关 list.stream().skip(3).forEach(s -> System.out.println(s));
map
List<String> list = Arrays.asList("1", "4", "5", "7"); /** * 匿名内部类的写法 */ //map 可以将流中的数据的 类型进行转换 //现在我们就将 string → int //new Function<String, Integer> string → 原本的数据类型 integer 要转成的数据类型 list.stream().map(new Function<String, Integer>() { @Override public Integer apply(String s) { // s → 流中的每一个数据 int result = Integer.parseInt(s); return result; } }).forEach(s-> System.out.println(s)); /** * 2. Lambda 表达式的写法 */ list.stream().map(s->Integer.parseInt(s)).forEach(s-> System.out.println(s));
stream流的最终方法
toArray
List<String> list = Arrays.asList("张三", "李四", "王五", "张思"); //将姓张的人收集到数组中 Object[] arr = list.stream().filter(s -> s.startsWith("张")).toArray(); System.out.println(Arrays.toString(arr));
collect
List<String> list = Arrays.asList("张三", "李四", "王五", "张思"); //将姓张的人收集到集合中 List<String> list1 = list.stream().filter(s -> s.startsWith("张")).collect(Collectors.toList()); System.out.println(list1); //将姓张的收集到set集合中 Set<String> set = list.stream().filter(s -> s.startsWith("张")).collect(Collectors.toSet()); System.out.println(set);
收集到map中
List<String> list = Arrays.asList("张三-18", "李四-19", "王五-20", "张思-12"); //将数据收集到map中 //Collectors.toMap(参数一:制定键生成的规则,制定值生成的规则) Map<String, String> map = list.stream().collect(Collectors.toMap(s -> s.split("-")[0], s -> s.split("-")[1])); System.out.println(map);