MENU

常见的Stream流生成

• May 12, 2020 • Read: 89 • JavaCore,Note

常见的Stream流生成

数组

String[] strArrays = {"hello","hhh","lalala"};
Stream<String> strStream = Stream.of(strArrays);
// 也可以直接食用
Stream<Integer> integerStream = Stream.of(10, 11, 12);

List集合

List<String> list = new ArrayList<>();
Stream<String> listStream = list.stream();

Set集合

Set<String> set = new HashSet<>();
Stream<String> setStream = set.stream();

Map集合

Map<String,String> map = new HashMap<>();
Stream<String> keyStream = map.keySet().stream();
Stream<String> valuesStream = map.values().stream();
// 或者
Stream<Map.Entry<String, String>> stream = map.entrySet().stream();

常见的Stream方法

先事先准备一个数组,做测试用。

List<String> list = new ArrayList<>();
list.add("钟先生");
list.add("钟太太");
list.add("钟老");
list.add("张老板");
list.add("张总");

filter

用于对流中的数据进行过滤(注意:是把你需要的内容过滤出来)

需求1. 把list集合中以张开头的元素在控制台输出

list.stream().filter(s -> s.startsWith("张")).forEach(System.out::println);

需求2. 把长度为3的输出

list.stream().filter(s -> s.length() == 3).forEach(System.out::println);

需求3. 把集合中以张开头且长度为3的元素输出

list.stream()
        .filter(s -> s.startsWith("张"))
        .filter(s -> s.length() == 3)
        .forEach(System.out::println);

limit

返回此流中的元素组成的流,截取前指定参数个数的数据

需求1. 取前3个数据在控制台输出

list.stream().limit(3).forEach(System.out::println);

skip

跳过指定参数个数的数据,返回由该流的剩下元素组成的流

需求1. 跳过前3个元素,把剩下的输出

list.stream().skip(3).forEach(System.out::println);

需求2. 跳过2个元素,把剩下的元素中前2个输出

list.stream().skip(2).limit(2).forEach(System.out::println);

concat

合并两个流成为一个新的流,静态方法,调用时应该是Stream.concat()

需求:取前4个数据组成一个流,跳过2个数组组成一个流,将两个流合并

Stream<String> s1 = list.stream().limit(4);
Stream<String> s2 = list.stream().skip(2);
Stream.concat(s1,s2).forEach(System.out::println);

distinct

消除重复数据

需求:上面合并后的流中元素不重复

Stream.concat(s1,s2).distinct().forEach(System.out::println);

sorted

需求1:按照字母顺序把数据输出

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("b");
    list.add("a");
    list.add("dc");
    list.add("da");

    list.stream().sorted().forEach(System.out::println);
}

count

统计数量

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("b");
    list.add("a");
    list.add("dc");
    list.add("da");
    long count = list.stream().count();
    System.out.println(count);
}

Stream流收集

收集到List集合

List<String> list = new ArrayList<>();
list.add("钟先生");
list.add("钟太太");
list.add("钟老");
list.add("张老板");
list.add("张总");

Stream<String> stream = list.stream().filter(s -> s.startsWith("钟"));
List<String> collect = stream.collect(Collectors.toList());

收集到Set集合

Set<String> set = new HashSet<>();
set.add("钟先生");
set.add("钟太太");
set.add("钟老");
set.add("张老板");
set.add("张总");

Stream<String> stream = set.stream().filter(s -> s.length() == 2);
Set<String> collect = stream.collect(Collectors.toSet());

收集到Map

下面的代码根据需求来写,有些复杂,可能需要你仔细阅读一下代码才能看懂.

// 该数组表示(名字,分数)
String[] strings = {"乐心湖,100", "张小王,90", "王小湖,66"};
// 得到分数大于70的家伙
Stream<String> stream = Stream.of(strings).
        filter(s -> Integer.parseInt(s.split(",")[1]) > 70);
//使用stream流操作完毕的数据收集到Map集合中并遍历,姓名为key,年龄为value
Map<String, Integer> map = stream.collect(Collectors.toMap(
    s -> s.split(",")[0],
    s -> Integer.parseInt(s.split(",")[1]))
);

for (Map.Entry<String, Integer> entry : map.entrySet()) {
    System.out.println(entry.getKey()+": "+entry.getValue());
}

本站所有未注明转载的文章均为原创,并采用CC BY-NV-SA 4.0 授权协议,转载请注明来源。

Last Modified: May 16, 2020
Archives QR Code
QR Code for this page
Tipping QR Code
Leave a Comment

已有 1 条评论
  1. saSS saSS

    hello