Java8新特性(整理)

1、lamdba表达式替代匿名内部类

//匿名内部类
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("aaa");
    }
}).start();
//直接用lamdba表达式创建线程
new Thread(() -> {
    System.out.println("aaa");
}).start();

//使用匿名内部类
Runnable runner1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("bbb");
    }
};
//直接用lamdba表达式创建线程
Runnable runner = () ->{
    System.out.println("bbb");
};
//此时没有开线程,只是单纯的调用run方法
runner.run();
runner1.run();

2、streams
stream 表示一个序列,在这个序列上可以执行一个或多个操作。流操作分为中间操作和最终操作两类,最终操作返回一个特定类型的结果,中间结果返回流对象,这样可以在同一行链式调用多个方法。创建stream要指定数据源,collection 例如list 、set(不支持map)。stream可以支持串行也可以支持并行
Filter

stringCollection.stream().filter((s) -> s.startsWith("a")).forEach(System.out::println);

Sorted

strings.stream().sorted((a,b) -> b.compareTo(a)).filter((s) -> 	s.startsWith("a")).forEach(System.out::println);

Map
map是一个中间操作,它把每个元素通过指定的方法转换成另一个对象,结果流的类型依赖传入给map的函数的执行结果的类型。
strings.stream().map(s -> s + “11”).forEach(s -> System.out.println(s));
Match
提供各种match匹配操作,用于检查指定的predicate是否匹配整个stream。所有的这些匹配操作是最终操作,返回boolean结果。

boolean boolean1 = strings.stream().anyMatch((s) -> s.startsWith("a"));
System.out.println(boolean1);
boolean boolean2 = strings.stream().allMatch((s) -> s.startsWith("a"));
System.out.println(boolean2);
boolean boolean3 = strings.stream().noneMatch((s) -> s.startsWith("a"));
System.out.println(boolean3);

Count
count是一个最终操作,返回stream中的元素个数,返回值是long类型。

long count = strings.stream().filter((s) -> s.startsWith("a")).count();
System.out.println(count);

Limit

strings.stream().sorted().limit(3).forEach((s) -> System.out.println(s));

并行处理
ParallelStream是Stream用于并行处理的一种替代方案。下面的代码段演示了如何使用它来输出空字符串的数量。并行的效率高。
long count = strings.parallelStream().filter(string -> string.isEmpty()).count();
Collector
Collector用于合并Stream的元素处理结果。它可以用于返回一个字符串列表。

List<String> list = strings.stream().filter((s) -> !s.isEmpty()).collect(Collectors.toList());
String string = strings.stream().filter((s) -> !s.isEmpty()).collect(Collectors.joining(","));

统计工具

IntSummaryStatistics statistics = integers.stream().mapToInt((x) -> x).summaryStatistics();
double average = statistics.getAverage();
long count = statistics.getCount();
int max = statistics.getMax();
long sum = statistics.getSum();

3、Optional
Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
Optional 类的引入很好的解决空指针异常。

Integer value1 = null;
Integer value2 = new Integer(10);
// Optional.ofNullable - 允许传递为 null 参数
Optional<Integer> a = Optional.ofNullable(value1);
// Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException
Optional<Integer> b = Optional.of(value2);
// Optional.isPresent - 判断值是否存在
System.out.println("第一个参数值存在: " + a.isPresent());
System.out.println("第二个参数值存在: " + b.isPresent());
// Optional.orElse - 如果值存在,返回它,否则返回默认值
Integer value1 = a.orElse(new Integer(0));
//Optional.get - 获取值,值需要存在
Integer value2 = b.get();

4、新的日期和时间API
LocalDate
LocalDate类型包含了年月日信息,下面举些LocalDate的使用示例:

LocalDate date = LocalDate.of(2018, 8, 30); // 2018-08-30
int year = date.getYear(); // 2018
int month = date.getMonth().getValue(); // 8
int day = date.getDayOfMonth(); // 30
// 查看该月有多少天
int days = date.lengthOfMonth(); // 31
// 是否是闰年
boolean isLeap = date.isLeapYear(); // false

可以使用LocalDate.now()获取当天的日期信息:

LocalDate today = LocalDate.now(); // 2019-01-09

除了调用LocalDate的getYear方法外,我们也可以使用ChronoField枚举类型来实现相同的功能:

int year1 = date.get(ChronoField.YEAR); // 2018
int month1 = date.get(ChronoField.MONTH_OF_YEAR); // 8
int day1 = date.get(ChronoField.DAY_OF_MONTH); // 30
// 当前日期属于该月第几周
int weekOfMonth = date.get(ChronoField.ALIGNED_WEEK_OF_MONTH); // 4
我们还可以对LocalDate进行格式化操作:
String str1 = date.format(DateTimeFormatter.BASIC_ISO_DATE); // 20180930
String str2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE); // 2018-09-30
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String str5 = date.format(dtf); // 2018-09-30
LocalDate date13 = LocalDate.parse(str5, dtf); // 2018-09-30

LocalDateTime之间共享了许多类似的方法,上面介绍的LocalDate修改、格式化等方法通用适用于LocalTime和LocalDateTime。
LocalTime

LocalTime time = LocalTime.of(20, 13, 54); // 17:18:54
int hour = time.getHour(); // 17
int minute = time.getMinute(); // 18
int second = time.getSecond(); // 54
LocalDate和LocalTime都可以通过字符串来创建:
LocalDate date = LocalDate.parse("2018-09-30");
LocalTime time = LocalTime.parse("17:18:54");

LocalDateTime
LocalDateTime是LocalDate和LocalTime的组合形式,包含了年月日时分秒信息。

LocalDateTime ldt1 = LocalDateTime.of(2018, 9, 30, 17, 18, 54); // 2018-09-30T17:18:54
LocalDateTime ldt2 = LocalDateTime.of(date, time); // 2018-09-30T17:18:54

LocalDateTime可以转换为LocalDate和LocalTime,转换后包含的信息减少了:

LocalDate date1 = ldt1.toLocalDate(); // 2018-09-30
LocalTime time1 = ldt1.toLocalTime(); // 17:18:54

同样的,LocalDate和LocalTime也可以转换为LocalDateTime,只需要补上日期或者时间:

LocalDateTime ldt3 = date.atTime(time); // 2019-09-30T17:18:54
LocalDateTime ldt4 = date.atTime(17, 18, 54); // 2019-09-30T17:18:54
LocalDateTime ldt5 = time.atDate(date); // 2019-09-30T17:18:54
比较两个时间的先后
LocalDate date15 = LocalDate.of(2018,9,31);
date.isEqual(date15); // false
date.isAfter(date15); // false
date.isBefore(date15); // true

5、对Base64新支持
Java 8 内置了 Base64 编码的编码器和解码器。
Base64工具类提供了一套静态方法获取下面三种BASE64编解码器:
· 基本:输出被映射到一组字符A-Za-z0-9+/,编码不添加任何行标,输出的解码仅支持A-Za-z0-9+/。
· URL:输出映射到一组字符A-Za-z0-9+_,输出是URL和文件。
· MIME:输出隐射到MIME友好格式。输出每行不超过76字符,并且使用’\r’并跟随’\n’作为分割。编码输出最后没有行分割。

try {
    // 使用基本编码
    String base64encodedString = Base64.getEncoder().encodeToString("runoob?java8".getBytes("utf-8"));
    System.out.println("Base64 编码字符串 (基本) :" + base64encodedString);
    // 解码
    byte[] base64decodedBytes = Base64.getDecoder().decode(base64encodedString);
    System.out.println("原始字符串: " + new String(base64decodedBytes, "utf-8"));
    base64encodedString = Base64.getUrlEncoder().encodeToString("TutorialsPoint?java8".getBytes("utf-8"));
    System.out.println("Base64 编码字符串 (URL) :" + base64encodedString);
    StringBuilder stringBuilder = new StringBuilder();
    for (int i = 0; i < 10; ++i) {
        stringBuilder.append(UUID.randomUUID().toString());
    }
    byte[] mimeBytes = stringBuilder.toString().getBytes("utf-8");
    String mimeEncodedString = Base64.getMimeEncoder().encodeToString(mimeBytes);
    System.out.println("Base64 编码字符串 (MIME) :" + mimeEncodedString);
    } 
catch (UnsupportedEncodingException e) {
    System.out.println("Error :" + e.getMessage());
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值