Java 8(Lambda/Stream/DateAPI)
2020-10-21 18:09:02 1 举报
AI智能生成
Java 8 新特性
作者其他创作
大纲/内容
Java 8 新特性
lambda表达式
特点
从本质来讲,lambda表达式是一个匿名函数。可以使用这个匿名函数,简洁的实现接口中的方法
不过并不是所有接口都可以简化,lambda表达式毕竟只是一个匿名方法,只能简化函数式接口
函数式接口
要求实现类必须实现的抽象方法,有且只有一个(不包括default、toString)
@FunctionalInterface标记在接口上用来判断是否是函数式接口,如果不是则会报错
语法
(参数) -> { 方法体;}
参数列表:方法的参数列表,要求和实现的接口中的方法参数一致,包括参数的数量和类型(可省)
方法体:方法的实现部分,如果接口中定义的方法有返回值,则在实现的时候,注意返回值的返回
进阶
参数类型可省略,多个参数要省都省,要不省都不要省
如果只有一个参数,小括号可省略,如果多个参数或者没有参数,小括号不能省
方法体只有一条语句时大括号可以省略,如果该句是返回语句,则return也不写
方法引用
概念
lambda方法体中引用一个已经存在的方法,使其替代lambda表达式完成接口的实现
注意
参数类型、个数、返回值类型和函数式接口中的方法保持一致才可以
类型
静态方法引用
类名::静态方法名【不要加小括号】
非静态方法引用
对象::非静态方法名【不要加小括号】
构造方法引用
类名::new【可以通过接口中的方法的参数,区分引用不同的构造方法】
对象方法的特殊引用
类名::对象方法
在使用lambda表达式时方法体中使用到了某个局部变量,那么这个变量默认被final修饰,后面不能被修改
Stream流
Stream是对集合操作的增强,流不是集合的元素,不是一种数据结构 ,不负责数据的存储流更像是一个迭代器,可以单向的遍历一个集合中的每一个元素 ,并且不可循环【数据源】
为什么要用流式编程?
对集合中元素进行操作的时候需要用到其他操作的结果,流式编程可以大幅度简化代码的数量
将数据源中的数据读到一个流中,可以对流进行过滤、映射等操作,每次的操作结果也是一个流对象
使用步骤
获取数据源,将数据源中的数据读取到流中
对流中的数据进行各种各样的处理
中间操作
对流中的数据进行整合处理
最终操作
获取数据源
通过Collection接口中的stream()方法获取数据源为集合的流对象【同步流】
Stream<Integer> stream = list.stream();
通过Collection接口中的parallelStream()方法获取数据源为集合的流对象【并发、异步流】
Stream<Integer> stream = list.parallelStream();
通过Arrays工具类中的stream()方法获取数据源为数组的流
IntStream stream = Arrays.stream(array) ;
最终操作执行结束后,会关闭这个流,流中的所有数据都会销毁
collect
将流中的数据收集到一起,最常见的就是将流中的数据存入集合
List<Integer> result = list.stream.collect(Collectors.toList());
Set<Integer> result = list.stream.collect(Collectors.toSet());
reduce
将流中的数据按照一定的规则聚合起来
等价于 reduce(Integer::sum).get();
count
统计流中的元素数量
int num = list.stream().count();
forEach
迭代、遍历流中的数据
list.stream().forEach(System.out::println);
max & min
获取流中的最大/最小元素
list.stream().max(Integer::compareTo).get();
Matching
allMatch:只有当流中所有的元素,都匹配指定的规则,才会返回 true
anyMatch:只要流中有任意的数据,满足指定的规则,都会返回 true
noneMatch:只有当流中的所有的元素,都不满足指定的规则,才会返回 true
find
一般情况下,这两个结果相同多线程环境下结果可能不一样
findFirst:从流中获取第一个元素
findAny:从流中获取任意一个元素
中间操作就是对流中的数据进行各种各样的处理,可以连续操作,每个操作的返回值都是stream对象
filter
条件过滤,仅保留流中满足指定条件的数据,其他不满足的数据都会被删除
list.stream().filter(ele -> ele.length() > 5).forEach(System.out::println);
distinct
去除集合中重复的元素。这个方法没有参数。去重的规则与HashSet相同
list.stream().distinct().forEach(System.out::println);
sorted
将流中的数据进行排序
默认排序
list.stream().sorted().forEach(System.out::println);
自定义排序
limit & skip
limit:限制,截取流中开头指定数量的元素
list.stream().limit(3).forEach(System.out::println);
skip:跳过,跳过流中的指定数量的元素
list.stream().skip(3).forEach(System.out::println);
配合使用,截取中间部分元素
list.stream().skip(5).limit(2).forEach(System.out::println);
map & flatMap
map:对流中的数据进行映射,用新的数据替换旧的数据
list.stream().map(ele -> ele+\".txt\").forEach(System.out::println);
flatMap:扁平化映射,将字符串数组转化为一个个的字符
Arrays.stream(array).map(s -> s.split(\"\")).flatMap(Arrays::stream).forEach(System.out::println);
mapToInt
将流中的数据替换成int类型,此时得到 IntStream 结果
double avg = list.stream().mapToInt(Person::getAge).average().getAsDouble();
日期 API
LocalDate
获取当前日期
LocalDate today = LocalDate.now();
默认使用短线分割
自定义日期
单独修改某项
使用withDayOfYear(2)、withMonth(10)、withYear(2020)
获取日期详情
大写英文全称
获取当前日期的月份
today.getMontyValue();
获取当前日期是几号
today.getDayOfMonth();
获取当前日期是星期几
today.getDayOfWeek();
获取当前日期是几月份
today.getMonth();
增减日期
时光倒流
将当前日期减一天:today.minusDays(1);
将当前日期减一周:today.minusWeeks(1);
将当前日期减一个月:today.minusMonths(1);
将当前日期减一年:today.minusYears(1);
穿越未来
plusDays|plusWeeks|plusMonths|plusYears
LocalTime
获取当前时间
LocalTime time = LocalTime.now();
15:35:59.666556 精确到微秒
自定义时间
10:08:59
使用withHour(23)、withMinute(59)、withSecond(59)
获取时间详情
获取当前小时数
time.getHour();
获取当前分钟数
time.getMinute();
获取当前秒数
time.getSecond();
增减时间
当前时间减一小时:time.minusHours(1);
当前时间减一分钟:time.minusMinutes(1);
当前时间减一秒钟:time.minusSeconds(1);
plusHours|plusMinutes|plusSeconds
LocalDateTime
获取当前日期和时间
LocalDateTime now = LocalDateTime.now();
获取当前时间毫秒数
秒:LocalDateTime.now().toEpochSecond(date);
毫秒:LocalDateTime.now().toInstant(date).toEpochMilli();
格式化时间
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\");
String text = formatter.format(now); //使用模版格式化时间【日期->字符串】
时间比较
isBefore(now)|isAfter(now)|isEqual(now)
获取带时区的时间
ZoneOffset.of(\"+9\");
0 条评论
回复 删除
下一页