美文网首页javajava lambda
为什么需要lambda

为什么需要lambda

作者: spraysss | 来源:发表于2019-01-29 17:00 被阅读0次

    OOP vs lambda

    如果说面向对象编程时对数据的抽象,那么函数式编程就是对行为的抽象。lambda 更利于实现并行编程并且更加的简洁。

    lambda 的写法

    ->将lambda分为两个部分:左边是参数,右边是语句。
    ②参数不需要写明参数类型,javac会根据上下文进行类型推断。
    ③当没有参数时,左边为()就行
    ④当只有一行语句时{}可以省略

    1.  Runnable noArguments = () -> System.out.println("Hello World");
    
    2.ActionListener oneArgument = event -> System.out.println("button clicked");
    
    3.Runnable multiStatement = () -> {
    System.out.print("Hello");
    System.out.println(" World");
    };
    
    4.BinaryOperator<Long> add = (x, y) -> x + y;
    
    5.BinaryOperator<Long> addExplicit = (Long x, Long y) -> x + y;
    

    函数式接口

    只有一个抽象方法的接口称之为函数式接口。lambda可以很简洁的实现函数式接口。java8自带了一些函数式接口

    函数 参数 返回值 example
    Predicate<T> T boolean Has this album been released yet?
    Consumer<T> T void Printing out a value
    Function<T,R> T R Get the name from an Artist obj
    Supplier<T> None T A factory method
    UnaryOperator<T> T T Logical not (!)
    BinaryOperator<T> (T, T) T Multiplying two numbers (*)

    Stream

    Stream是支持顺序和并行聚合操作的元素序列,并且函数操作基于lambda编程范式实现
    java 官网关于Strem特征的介绍

    Stream 上的操作为管道操作,它由如下要素构成

    • 数据源,比如集合,数组,IO channel 构成
    • 中间操作,比如filter 过滤操作,distinct去重操作
    • 终止操作,比如 count() or forEach(Consumer))
      流是惰性执行的,仅在启动终止操作时才对源数据执行管道计算
    操作类型 接口方法
    中间操作 concat() distinct() empty() filter() flatMap() flatMapToDouble() flatMapToInt() flatMapToLong() generate() iterate() limit() map() mapToDouble() mapToInt() mapToLong() of() peek() skip() sorted() parallel() sequential() unordered()
    终止操作 allMatch() anyMatch() collect() count() findAny() findFirst() forEach() forEachOrdered() max() min() noneMatch() reduce() toArray()

    集合类转Stream

    java中的集合类可以方便的转化为Stream 然后应用lambda

    Collection 类签名

    public interface Collection<E> extends Iterable<E> 
    

    Collection 中提供了两个转化为Stream的方法

    • stream()
    • parallelStream()

    list,set,queue因为实现的Collection 接口所以可以直接调用stream()parallelStream()转为Stream
    map 没有实现Collection接口,但是map可以调用 map.entrySet(), map.keySet(),map.values()转为集合类然后使用Stream方法

    java集合类图

    小demo

    map格式化为String,以及String 转map

          Map<String, Integer> map = new HashMap<>();
            map.put("A", 1);
            map.put("B", 2);
            String mapString=map.keySet().stream().map(k -> k + "=" + map.get(k)).collect(Collectors.joining(",", "{", "}"));
            System.out.println(mapString);
            Arrays.stream(mapString.split(",")).map(entry->entry.split("=")).collect(Collectors.toMap(e->e[0],e->e[1]));
    

    参考

    https://www.cnblogs.com/CarpenterLee/category/965121.html

    相关文章

      网友评论

        本文标题:为什么需要lambda

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