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);