美文网首页
Java8新特性

Java8新特性

作者: sgy_j | 来源:发表于2020-07-06 22:01 被阅读0次

    Stream

    类Stream是对象和原始数据类型上的流。Stream在几个方面与集合不同:

    • 没有存储空间。流不是存储元素的数据结构。相反,它通过一系列计算操作从数据结构,数组,生成器功能或I / O通道等源中传递元素。
    • 本质上是功能性的。对流的操作会产生结果,但不会修改其源。例如,对Stream 从集合中获取的a Stream进行过滤会产生一个不包含过滤后元素的新元素,而不是从源集合中删除元素。
    • 懒惰寻求。许多流操作(例如过滤,映射或重复删除)可以延迟执行,从而暴露出优化的机会。例如,“ String使用三个连续的元音查找第一个”不需要检查所有输入字符串。流操作分为中间(产生Stream)操作和最终(产生值或副作用)操作。中间操作总是很懒。
    • 可能无界。尽管集合的大小是有限的,但流不是必需的。诸如limit(n)或 的短路操作findFirst()可以允许对无限流的计算在有限时间内完成。
    • 消耗品。在流的生存期内,流的元素只能访问一次。与一样Iterator,必须生成新的流以重新访问源中的相同元素。

    stream操作分为中间操作终端操作,合并以形成pipeline

    • pipeline由源(如Collection,数组,生成器函数或I / O通道),零个或多个中间操作以及一个终端操作。
    • 中间操作,执行一个中间操作(如filter)并不会执行实际的过滤操作,而是创建一个新的stream,并将原stream中符合条件的元素放入新创建的stream。
    • 终端操作,会遍历stream并得出结果或者附带结果;在执行终端操作之后,pipeline已经处理完毕,不可以在使用了。

    下面对常见的stream操作进行介绍

    • filter
    • map
    • mapToInt
    • sorted
    • distinct
    • forEach,
    • sum
    • reduce

    根据指定模型,计算源内数据,得到一个最终结果

    对例子进行解释

    Function接口

    一个Function<T, R>对象相当于一个函数,其中T是函数参数类型,R是函数返回值类型,等号后面的lambda表达式为函数逻辑。

    R apply(T t)相当于函数调用,t为调用函数式传入的参数值。

    public class FunctionTest {
        public static void main(String[] args) {
            Integer num = 5;
            System.out.println(functionAdd(num)); // 6
            System.out.println(add(num)); // 6
        }
    
        public static Integer functionAdd(Integer num){
            Function<Integer, Integer> function = x -> x + 1;
            return function.apply(num);
        }
    
        public static Integer add (Integer num) {
            return num + 1;
        }
    }
    

    Function<V, R> compose()、Function<V, R> andThen()相当于函数组合,源码如下。

    /**
         * @return a composed function that first applies the {@code before}
         * function and then applies this function
         */
    default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }
    /**
         * @return a composed function that first applies this function and then
         * applies the {@code after} function
         */
    default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }
    

    根据方法名获取对象方法值

    @Data
    @AllArgsConstructor
    public class Person {
        private Double age;
        private Double height;
    }
    
    @AllArgsConstructor
    @Getter
    public enum PersonAttribute {
        AGE("age", Person::getAge),
        HEIGHT("height", Person::getHeight);
    
        private String name;
        private Function<Person, Double> getAttribute;
    
        public static PersonAttribute ofName(String name) {
            try {
                return Arrays.stream(PersonAttribute.values())
                        .filter(personAttribute -> personAttribute.name.equals(name.trim()))
                        .findFirst()
                        .orElseThrow(() -> new Exception("input attribute's name error:" + name));
            } catch (Exception exception){
                exception.printStackTrace();
            }
            return null;
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            Person person = new Person(18D, 160D);
            Scanner scanner = new Scanner(System.in);
            PersonAttribute personAttribute = PersonAttribute.ofName(scanner.nextLine());
            System.out.println(personAttribute.getGetAttribute().apply(person));
        }
    }
    

    ::

    https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps

    相关文章

      网友评论

          本文标题:Java8新特性

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