javajava lambda

为什么需要lambda

2019-01-29  本文已影响0人  spraysss

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 上的操作为管道操作,它由如下要素构成

操作类型 接口方法
中间操作 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的方法

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

上一篇 下一篇

猜你喜欢

热点阅读