欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

17 - Stream流

程序员文章站 2022-05-22 15:05:10
...

Stream流的生成方式

  • Collection体系的集合可以使用默认方法stream()生成流 default Stream stream()
  • Map体系的集合间接生成流
Map<String, Integer> map = new HashMap<>();
Stream<String> mapStream = map.keySet().stream();
Stream<Integer> mapstream = map.values().stream();
Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();
  • 数组可以通过Stream接口的静态方法`of(T…values)生成流
String[] arr = {"hello", "world", "java"};
Stream<String> arrStrem = Stream.of(arr);
Stream<String> arrstrem = Stream.of("hello", "world");
Stream<Integer> arrStrem2 = Stream.of(10, 20, 30);

Stream流常见的中间操作方法

  • Stream<T> filter(Predicate pre):用于对流中的数据进行过滤
    • Predicate接口中的方法为:boolean test(T t),判断,并返回一个布尔值
  • Stream<T> limit(long maxSize):返回此流中的元素组成的流,截取前指定参数个数的数据
  • Stream<T> skip(long n):跳过指定参数个数的数据,返回由该流的剩余元素组成的流
  • static <T> Stream<T> concat(Stream a, Stream b):合并a和b两个流为一个流
  • Stream<T> distinct():返回由该流的不同元素
  • Stream<T> sorted():返回由此流的元素组成的流,自然排序
  • Stream<T> sorted(Comparator com):返回由该刘的元素组成的流,根据提供的比较器排序
  • <R> Stream<R> map(Function mapper):返回由给定函数应用于此流的元素的结果组层的流
    • Function接口中的方法:R apply(T t)
  • IntStream mapToInt(ToIntFuction mapper):返回一个IntStream其中包含将给定函数应用于此流的元素的结果
    • IntStream:表示原始int流
    • ToIntFunction接口中的方法:int applyAsInt(T value)
arr.stream().filter(str->str.startsWith("J")).forEach(System.out::println);
arr.stream().limit(2).forEach(System.out::println);
arr.stream().skip(2).limit(1).forEach(System.out::println);
// -----------------------
arr.concat(s1, s2).distinct()
// 按照字母顺序输出       arr.stream().sorted().forEach(System.out::println);

// 按照字符串长度输出
arr.stream().sorted((s1, s2) -> {
    int num = s1.length() - s2.length();
    int res = num == 0 ? s1.compareTo(s2) : num;
    return res;
}).forEach(System.out::println);

// 将集合中的字符串转为int
list.stream().map(s->Integer.parseInt(s)).forEach(System.out::println);
list.stream().map(Integer::parseInt).forEach(System.out::println);
list.stream().mapToInt(Integer::parseInt).forEach(System.out::println);
//返回流中的总和
int sum = list.stream().mapToInt(Integer::parseInt).sum();
System.out.println(sum);

Stream流的收集操作

收集方法

  • R collect(Collector collector)
    工具类Collectors提供了具体收集方法
  • public static <T> Collector toList()
  • …toSet()
  • …toMap(Function keymapperm, Function valueMapper)
public class MystreamDemo6 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("林青霞");
        list.add("张敏");
        list.add("林心如");
        list.add("刘岩");
        list.add("林志玲");

        // 得到名字为三个字的流
        Stream<String> nameStream = list.stream().filter(name -> name.length() == 3);
        // 把流里的数据收集到集合
        List<String> names = nameStream.collect(Collectors.toList());
        System.out.println(names);

        Set<Integer> set = new HashSet<Integer>();
        set.add(33);
        set.add(29);
        set.add(26);
        set.add(30);
        set.add(40);

        // age > 30
        Stream<Integer> ageStream = set.stream().filter(age -> age > 30);
        Set<Integer> ages = ageStream.collect(Collectors.toSet());
        System.out.println(ages);

        String[] arr = {"林青霞,40","张敏,38","林志玲,41"};
        // age>40
        Stream<String> arrStream = Stream.of(arr).filter(str -> Integer.parseInt(str.split(",")[1]) > 40);
        //把上面的收集到map集合中
        Map<String, Integer> collect = arrStream.collect(Collectors.toMap(str -> str.split(",")[0], str -> Integer.parseInt(str.split(",")[1])));

        System.out.println(collect);
    }
}

相关标签: Java stream