• JDK1.8快速入门


    JDK8提供了非常多的便捷用法和语法糖,其编码效率几乎接近于C#开发,maven则是java目前为止最赞的jar包管理和build工具,这两部分内容都不算多,就合并到一起了。

    愿编写java代码的过程如:Fast & Furious

    鸟枪换炮咯,走起!J Java 7发布于2011年,Java 8发布于2014年,Java 9还远么?

    在javase8中,lambda表达式的形式基本好C#中一致,Stream和LINQ类似,Future<T>和Task<T>类似,可以这样说,javase8大体达到了C#编码的便捷程度哈!帅帅哒

    • Lambda(和.NET一样)

    功能

    示例

    函数式接口

    Arrays.sort(words, (first, second) ->

    Integer.compare(first.length(), second.length()));

    BiFunction<String, String, Integer> comp =

    (first, second) -> Integer.compare(first.length(), second.length());

    常见的函数式接口(推荐使用),和C#Action<T>,Function<T, R>类似

    Runnable,Supplier<T>,Consumer<T>, Function<T, R>, Predicate<T>

    方法引用

    Arrays.sort(words, String::compareToIgnoreCase);

    构造器引用

    list.stream().collect(Collectors.toList());

    默认方法,接口中的静态方法

    不太推荐

    概念

    所有的lambda表达式都符合闭包,且是延迟执行的

    • Stream

    功能

    示例

    创建Stream

    Stream<String> song = Stream.of("Shanghai", "Beijing");

    filter,map,flatmap方法

    分别对应C#中Linq的where,select和selectMany

    Optional<TravelTicket> tempTT = availableTicketMapper.values().stream().flatMap(i -> i.stream())
    .filter(i -> i.getID() == item.getTravelMoneyID()).findFirst()

    常见操作

    去除重复: .distince()

    排序.sorted(), 反向.reversed()

    List<TravelTicketCommonDTO> targetList = orderedAvailableTTInfoList.stream()
    .filter(i -> i.getTicketCategoryID().equals(item.getTicketCategoryID())
    && i.getCanRefundAmount().compareTo(BigDecimal.ZERO) > 0)
    .sorted(Comparator.comparing(TravelTicketCommonDTO::getExpirationDate).reversed())
    .collect(Collectors.toList());

    聚合方法 .max(), findFirst(), .findAny(), .anyMatch()

    聚合操作 .reduce((x,y)->x+y),reduce(BigDecimal.ZERO, BigDecimal::add)

    分组和分片: .groupingBy(), mapping(), joining()

    并行流: .parallel()

    Optional类型

    Optional<T>是对T类型封装,它不会返回null,使得引用更安全

    • 时间日期

    在1.8以前,主要使用joda-time库来处理一些比较复杂的时间日期操作,现在有官方的api了。

    http://www.cnblogs.com/565261641-fzh/p/5683594.html

    功能

    示例

    时间线Instant

    Instant start = Instant.now();

    Thread.sleep(1000);

    Instant end = Instant.now();

    Duration timeElapsed = Duration.between(start, end);

    long millis = timeElapsed.toMillis();

    本地日期LocalDate

    LocalDate today = LocalDate.now();

    LocalDate oneDay = LocalDate.of(2017, 7, 9);

    LocalDate addDay = LocalDate.now().plusDays(10);

    日期校正器TemporalAdjueters

    获取2017年5月的第一个周二

    LocalDate time = LocalDate.of(2017, 5, 1)

    .with(TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY));

    本地时间LocalTime

    LocalTime time = LocalTime.of(16, 37, 11);

    带时区的时间ZonedDateTime

    ZonedDateTime applloTime = ZonedDateTime.of(2017, 5, 9, 16, 40, 11, 0, ZoneId.of("America/New_York"));

    格式化和解析DateTimeFormatter

    用于替代过去的DateFormat,SimpleDateFormat

    遗留代码的互操作

    Instant start = Instant.now();其他类型的操作类似

    Date oldDate = Date.from(start);

    • 并发

    功能

    示例

    原子值

    AtomicLong nextNumber = new AtomicLong();

    nextNumber.incrementAndGet();

    ConcurrentHashMap的改进

    ConcurrentMap<String, Integer> map = new ConcurrentHashMap();

    map.putIfAbsent("age", 100);

    map.compute("name", (k, v) -> v == null ? 1 : v + 1);

    map.merge("age", 1, (oldValue, newValue) -> oldValue + newValue);

    批量数据操作:reduceValue, reduceKeys

    并行数组操作

    String[] people = new String[]{"xionger", "shuaishuaida"};

    Arrays.parallelSort(people);

    Future,和.NET的Task<T>类似

    CompletableFuture<String> contents =

    CompletableFuture.supplyAsync(() -> getAsync());

    这部分知识之后再加强

    • 杂项

    功能

    示例

    字符串

    String joined = String.join("/", "user", "local", "bin");

    数字扩展

    Long testValue = Integer.toUnsignedLong(Integer.MAX_VALUE);

    新的数值函数

    int result = Math.floorMod(Math.toIntExact(100L), 3);

    新增集合方法

    list.forEach((item) -> System.out.println(item));

    Map: remove, putIfAbsent, computeIf, merge

    排序:Arrays.sort(people, Comparator.comparing(Person::getAge));

    使用文件

    这儿看到try-with-resource,等价于using,java代码也可以和.net一样简介

    try (Stream<String> lines = Files.lines(path)) {

        Optional<String> pwd = lines.filter(s -> s.contains("pwd")).findFirst();}

    Base64编码

    Base64.Encoder encoder = Base64.getMimeEncoder();

    try (OutputStream output = Files.newOutputStream(encoderPath)) {

        Files.copy(originalPath, encoder.wrap(output));}

    注解

    通过在注解上添加@Repeatable,使得注解可多次使用

    可以使用基于类型的注解

    private @NonNull List<String> names = new ArrayList<>();

    方法参数反射,可以反射获取参数的名称

    Java7

    使用Path接口来代替File类

    Path absolute = Paths.get("/", "home", "shanghai ");

    Files.write(absolute, content.getBytes(StandardCharsets.UTF_8));

    Tip: demo项目

    Java Decimal运算需要注意:

    1、 ROUND_UP:向上取整(丢掉小数,整数加1) 远离零方向舍入。向绝对值最大的方向舍入,只要舍弃位非0即进位。
    2、ROUND_DOWN:向下取整(丢掉小数)。趋向零方向舍入。向绝对值最小的方向输入,所有的位都要舍弃,不存在进位情况。
    3、ROUND_CEILING:向正无穷方向走,始终不会减少计算值。如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;如果为负,则舍入行为与 ROUND_DOWN 相同。Math.round()方法就是使用的此模式。
    4、ROUND_FLOOR:向负无穷方向舍入。向负无穷方向靠拢。若是正数,舍入行为类似于ROUND_DOWN;若为负数,舍入行为类似于ROUND_UP。
    5、 HALF_UP:四舍五入,最近数字舍入(5进)。
    6、 HALF_DOWN:四舍六入,最近数字舍入(5舍)。
    7、 HAIL_EVEN:银行家舍入法。四舍六入五偶舍。即舍弃位4舍6入,当为5时看前一位,奇进偶舍。向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
         也就是说,如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同; 如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
         注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
    8、ROUND_UNNECESSARY 断言请求的操作具有精确的结果,因此不需要舍入。如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

    String[] tempList = ticketCategoryIDListString.split("\.");//大坑

    参考资料

    1. Cay, S, Horstmann. 写给大忙人看的JavaSE8[M]. 北京:电子工业出版社, 2015.
  • 相关阅读:
    Java Object类 和 String类 常见问答 6k字+总结
    又长又细,万字长文带你解读Redisson分布式锁的源码
    第三方API对接如何设计接口认证?
    免费正版 IntelliJ IDEA license 详细指南
    ClickHouse性能优化?试试物化视图
    全量同步Elasticsearch方案之Canal
    Canal高可用架构部署
    Spring官方发布新成员:Spring GraphQL
    为什么catch了异常,但事务还是回滚了?
    这几个事务案例会回滚吗?最后一个90%的人判断错了...
  • 原文地址:https://www.cnblogs.com/xiong2ge/p/jdk8_fast.html
Copyright © 2020-2023  润新知