美文网首页小卜java
JAVA lambda Map filter reduce

JAVA lambda Map filter reduce

作者: 汤太咸啊 | 来源:发表于2021-10-31 22:59 被阅读0次

    今天整理了一波Lambda的复杂操作,就是Map filter reduce操作。有问题您就评论。
    Stream
    内部不存储data
    不会改变data
    源实际上是任何一种来源,不清楚内部元素数量

    //返回一个空的Stream
    Stream.empty();
    //返回一个Singleton的Stream
    Stream.of("one");
    //多个元素的Stream
    Stream.of("one","two","three")
    //创建一个无限的one的Stream
    Stream.generate(() -> "one");
    //创建一个无限的Stream,第一个元素是“+”,第二个“++”,第三个“+++”依次类推
    Stream.iterate("+", s -> s+"+");
    //创建一个随机流的Stream,ints()返回的是随机整数值
    ThreadLocalRandom.current().ints();
    //通过字符拆分成char的Stream
    IntStream stream1 = "Hello".chars();
    //通过正则表达式创建的Stream
    String book = "";
    Stream<String> words = Pattern.compile("[^\\p{javaLetter}]").splitAsStream(book);
    //通过文件读取的行的Stream
    Stream<String> lines = Files.lines(Paths.get("/Users/buxuesong/Documents/svn_code/demo/test.txt"));
    System.out.println(lines);
    //通过Builder创建Stream.Builder
    Stream.Builder<String> builder = Stream.builder();
    //可以通过链模式添加元素
    builder.add("one").add("two").add("three");
    //可以通过accept接受元素
    builder.accept("four");
    //将builder转换为Stream流
    Stream<String> stream2 = builder.build();
    //输出stream流的内容
    stream2.forEach(System.out::println);
    

    map()方法,可以改变stream的类型
    filter()方法,不改变stream的类型,但是可能会改变stream内部的数量
    peek()方法,和forEach类似,但是可以返回Stream,以供filter继续处理,peek属于中间调用

    //Map/filter/reduce
    people.stream() //Stream<Person>
            .map(p -> p.getAge())//Stream<Integer>
            .filter(age -> age>20)//Stream<Integer>
            .forEach(System.out::println);
    

    如何区分终端调用还是中间调用,中间调用反会的还是流,如果不是流则为终端调用
    skip()方法,跳过从开始到第n个元素
    limit()方法,从开始限制到第n个元素

    people.stream()
            .skip(2)
            .limit(3)
            .map(p -> p.getAge())
            .peek(System.out::println)
            .filter(age ->age>22)
            .forEach(System.out::println);
    

    Match Reduction的方法类型:
    anyMatch(),allMatch(),noneMatch()返回结果均为boolean,他们可能不会评估所有的元素的位次,因此被称为short-circuiting terminal短路终端操作。

    boolean b = people.stream().anyMatch(p -> p.getAge()>20);
    
    Find Reduction的方法类型:
    findAny(),findFirst()
    

    Stream.generate()注意一定要使用limit方法,否则会无限循环下去

    Stream<String> stream = Stream.generate(() -> "one");
    stream.limit(4).forEach(System.out::println);
    \\输出
    one
    one
    one
    one
    stream = Stream.iterate("+", s -> s+"+");
    stream.limit(5).forEach(System.out::println);
    \\输出
    +
    ++
    +++
    ++++
    +++++
    

    IntStream

    IntStream intStream = ThreadLocalRandom.current().ints();
    intStream.limit(5).forEach(System.out::println);
    \\输出
    1259268410
    -1738334784
    -816674339
    -2136871006
    -366691383
    

    相关文章

      网友评论

        本文标题:JAVA lambda Map filter reduce

        本文链接:https://www.haomeiwen.com/subject/llvaaltx.html