为什么需要lambda

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容