日期时间API
- LocalDate:表示日期,包含年月日,格式为2019-10-16
- LocalTime:表示时间,包含时分秒,格式为16:38:54.158548300
- LocalDateTime:表示日期时间,包含年月日,时分秒,格式为2018-09-06T15:33:56.750
- DateTimeFormatter:日期时间格式化类。
- Instant:时间戳,表示一个特定的时间瞬间。
- Duration:用于计算2个时间(LocalTime, 时分秒)的距离
- Period:用于计算2个日期(LocalDate, 年月日)的距离
- ZoneDateTime:包含时区的时间
lambda表达式简介
lambda表达式允许通过表达式来代替功能接口
lambda表达式的语法
(parameters) -> expression
(parameters) -> { statements; }
双冒号(::)操作符是Java中的方法引用,当我们使用一个方法的引用时,目标引用放在::之前,目标引用提供的方法名称放在::之后,即目标引用::方法
- lambda表达式foreach代替for循环
for (String player : players) {
System.out.print(player + "; ");
}
players.forEach((player) -> System.out.print(player + "; "));
players.forEach(System.out::println);
- 代替匿名内部类,可用于实现Runnable接口
new Thread(() -> System.out.println("Hello world !")).start();
实现排序
- 匿名内部类
Arrays.sort(players, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return (s1.compareTo(s2));
}
});
- lambda表达式
Arrays.sort(players, (String s1, String s2) -> (s1.compareTo(s2)));
Comparator.reversed 返回相反的排序规则
Comparator.nullsFirst 当集合中存在null元素时,可以使用针对null友好的比较器,null元素排在集合的最前面
Comparator.thenComparing 首先使用某个字段排序,紧接着再使用某个字段排序
Stream简介
Stream如同一个迭代器(Iterator),隐式地在内部进行遍历,做出相应的数据转换,与迭代器不同的是Stream可以并行化操作,迭代器只能命令地、串行化操作。使用并行去遍历,数据会被分成多个段,其中每一个都在不同的线程中处理,将结果一起输出。Stream的并行操作依赖于Java7中引入的Fork/Join框架来拆分任务和加速处理过程。
Stream的转换
-
filter操作:原stream中满足条件的元素构成新的stream
long num = list.parallelStream()
.filter(x -> x.length() < 5)
.count();
-
map操作:遍历原stream中元素,转换后构成新的stream
List<String> result = list.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
-
sort操作:排序
sortedJavaProgrammers = javaProgrammers
.stream()
.sorted( (p, p2) -> (p.getSalary() - p2.getSalary()) )
.collect( toList() );
-
min/max操作
Person pers = javaProgrammers
.stream()
.min((p1, p2) -> (p1.getSalary() - p2.getSalary()))
.get()
-
summaryStatistics操作:获得stream中元素的各种汇总数据
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
IntSummaryStatistics stats = numbers
.stream()
.mapToInt((x) -> x)
.summaryStatistics();
System.out.println("List中最大的数字 : " + stats.getMax());
System.out.println("List中最小的数字 : " + stats.getMin());
System.out.println("所有数字的总和 : " + stats.getSum());
System.out.println("所有数字的平均值 : " + stats.getAverage());
-
distinct操作:去重
String output = list.stream()
.distinct()
.collect(Collectors.joining(","));
-
skip操作:跳过前n个元素
integerStream.skip(n)
.forEach(integer -> System.out.println("integer = " + integer));
-
limit操作
integerStream.limit(maxsize)
.forEach(integer -> System.out.println("integer = " + integer));
-
toMap操作
list.stream()
.collect(Collectors.toMap(item -> item.get("fundCode"), item -> item.get("skuId"));
-
toString操作
degradeList.stream()
.map(item -> item.get("business").getAsString() + ":" + item.get("prob").getAsDouble())
.collect(Collectors.joining("#"))
degradeList.stream() .map(item -> item.get("business").getAsString() + Constants.Separator.COLON + item.get("prob").getAsDouble()) .collect(Collectors.joining("#"))
-
findFirst查找满足条件的一条数据
topicDTO = topicDTOS.stream()
.filter(item -> StringUtils.equals(topicId, String.valueOf(item.getTopicId())))
.findFirst()
.orElse(topicDTOS.get(0));
-
flatMap操作
把几个小的list转换到一个大的list
List<StrategyPayload.Item> items = payloads.stream()
.flatMap(payload -> payload.getItems().stream())
.peek(item -> {
Double holdRate = holdMap.get(item.getProperties().get("fund_code"));
item.getProperties().put("hold_rate", String.valueOf(holdRate));
item.getProperties().put("stock_name", context.getValue("stock_name"));
item.getProperties().put("code", String.valueOf(BizPageSourceEnum.PageSource_ENUM_HEAVY_FUND.getCode()));
})
.collect(Collectors.toList());
Optional类
可以保存类型T的值,或者仅仅保存null,无需显式进行空值检测
- Optional.of() 创建Optional对象,不允许参数是null
- Optional.ofNullable() 创建Optional对象,允许参数是null
- isPresent() 判断值是否存在
- ifPresent(Consumer consumer) 如果option对象保存的值不是null,则调用consumer对象,否则不调用
- orElse(value) 如果optional对象保存的值不是null,则返回原来的值,否则返回value
- orElseGet() 功能与orElse相似,区别是orElseGet参数是一个对象
- orElseThrow() 值不存在则抛出异常,存在则什么都不做
- filter(Predicate) 判断Optional对象中保存的值是否满足Predicate,并返回新的Optional
- map(Function) 对Optional中保存的值进行函数运算,并返回新的Optional(可以是任何类型)
- flatMap(Function) 功能与map相似,区别在于函数的返回值不同,flatMap方法的返回值必须是Optional
函数式编程
- Consumer接口
消费型的接口,通过传入参数,然后输出值
accept方法
lambda表达式,方法引用可作为Consumer
Stream接口的forEach方法需要的参数是Consumer
- Supplier接口
供给型接口,容器
get方法
- Predicate接口
谓词型接口,类似bool类型判断
test方法
Stream接口的filter方法需要的参数是Predicate
- Function接口
功能型接口,转换作用,将输入数据转换成另一种形式的输出数据
apply方法
stream接口的map方法需要的参数是Function