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()
orforEach(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方法
![](https://img.haomeiwen.com/i4168546/d3c64d31dac09c3f.png)
小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]));
网友评论