idea自行下载插件,eclipse在安装路径下安装lombok.jar同时在eclipse.ini下配置
-javaagent:lombok.jar
-Xbootclasspath/a:lombok.jar
为属性提供getting和setting方法
注解在类上;为类提供一个无参的构造方法
注解在类上;为类提供一个全参的构造方法
提供一个toString方法
消除 try/catch/finally 块的冗余
注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了hashCode、toString 方法
在注解@Setter、@Getter、@ToString后面添加exclude=”**
“代表相应的方法不包括**
字段
如
@ToString(exculde=”color”)
则在toString方法里面忽略color属性
(params) -> expression
(params) -> statement
(params) -> { statements }
例子
() -> System.out.println("Hello Lambda Expressions");
Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)
流的特点
流的构成
使用流的时候,通常包括三个步骤:
常见的生成数据源的方式
从Collection和数组
对流的操作类型分为两种
例子:
int sum = widgets.stream()
.filter(w -> w.getColor() == RED)
.mapToInt(w -> w.getWeight())
.sum();
流的构造
//1.具体的值
Stream stream0=Stream.of("a","b","c");
//2.Arrays
String[] strArray=new String[]{"a","b","c"};
Stream stream1=Stream.of(strArray);
Stream stream2=Arrays.Stream(strArray);
//3.Collections
List list = Arrays.asList(strArray);
Stream stream3 = list.steam();
对于基本数据类型,对应三种包装类型Stream:
eg
IntStream.of(new int[]{1,2,3}).forEach.(System.out::println);
//结果为1 2
IntStream.range(1,3).forEach(System.out::println);
//结果为1 2 3
IntStream.rangeClosed(1, 3).forEach(System.out::println);
流的转换
//1.Array
String[] strArray1 = stream.toArray(String[]::new);
//2.Collection
List list = stream.collect(Collections.toList());
Set set = stream.collect(Collections.toSet());
//3.String
String string = stream.collect(Collections.join()).toString();
流的操作
常见操作归类如下:
-Intermediate:
map(mapToInt,flatMap等),filter,sorted,distinct,peek,limit,skip,parallel,sequential,unordered
- Terminal:
forEach,forEachOrdered,toArray,reduce,collect,min,max,count,anyMatch,allMatch,noneMatch,findFirst,findAny,iterator
map/flatMap
作用是将input Stream的每一个元素转换成outpu Stream的另外一个元素
转换为大写
List output = wordList.stream().map(String::toUpperCase).collect(Collections.toList());
-平方数
List nums = Arrays.asList(1,2,3,4);
List squareNums = nums.stream().map(n -> n*n).collet(Collections.toList());
上面的map生成的是1:1 映射,对于1对多的映射关系需要使用flatMap
Stream> inputStream = Stream.of(Arrays.asList(1),Arrays.asList(2,3),Arrays.asList(4,5,6));
Stream outputStream = inputStream.flatMap(n ->n.stream());
filter
filter 是对原始的Stream进行某种测试,通过测试的元素被留下来生成一个新的Stream
留下偶数
Integer[] nums = {1,2,3,4,5,6};
Integer evens = Stream.of(nums).filter(n -> n%2==0).toArray(Integer[]::new);
peek
返回一个符合条件的stream
findFrist
返回 Stream 的第一个元素,或者空
它的返回值是Optional:作为一个容器,目的是避免空指针异常
Optional:A container object which may or may not contain a non-null value. If a value is present, isPresent() will return true and get() will return the value.
Optional.get():值存在时返回值,不存在抛出NoSuchElementException;
Optional.ifPresent(Consumer super T> consumer):值存在时执行consumer操作,不存在值是不做任何;
Optional.isPresent():值存在时返回TRUE,不然doNothing;
Optional.orElse(T other):值存在时返回对应值,不存在是返回other
Optional.ofNullable(T value):值存在时返回一个描述value的Optional,不然返回一个空的Optional
Optional.ofNullable(text).ifPresent(System.out::println)
等价于if(text!=null){System.out.println(text)}
return Optional.ofNullable(text).map(String::length).orElse(-1);
等价于return if (text!=null)?text.length():-1;
Stream中的findAny max/min等方法也是返回Optional值
reduce
三个重载方法
- Optional reduce(BinaryOperator accumulator);
- T reduce(T identity, BinaryOperator accumulator);
- U reduce(U identity,BiFunction accumulator,BinaryOperator combiner)
第一个方法返回一个Optional:
`Optional sum = Arrays.asList(1,2).stream().reduce((a,b) -> a*b);`
第二个方法是提供一个起始值,然后根据运算规则和前面的Stream的第一、第二...第N个元素组合
`Integer sum = Arrays.asList(1,2).stream().reduce(2, (a, b) -> a*b);`
的结果sum等于4
第三种方法。。。。
limit skip
limit 是返回Stream的前n个元素,skip是扔掉前n个元素
Arrays.asList(1,2,3,4,5,6).stream().limit(5).skip(1).forEach(System.out::println);
的结果是2 3 4 5
sorted
对 Stream 的排序通过 sorted 进行,它比数组的排序更强之处在于你可以首先对 Stream 进行各类 map、filter、limit、skip 甚至 distinct 来减少元素数量后,再排序,这能帮助程序明显缩短执行时间
distinct
去重
Match
Stream 有三个 match 方法