【学习笔记】JDK7、8相关

日期时间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

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值