17 - Stream流

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

Guess you like

Origin blog.csdn.net/qq_42899028/article/details/119316710