Java8 新特性指导手册

java8有很多新的特性,这些特性给coding带来了很多便利。接下来会介绍一下java8的新特性使用。

// 1、lambda表达式
public void test0() {
    List<String> list = Arrays.asList("a", "bg", "cc");

    Collections.sort(list, new Comparator<String>() {
        @Override
        public int compare(String s, String t1) {
            return s.compareTo(t1);
        }
    });

    // lambda 表达式
    list.sort((o1, o2) -> o1.compareTo(o2));
}
// 2、函数式接口
// 定义接口
@FunctionalInterface
interface Converter<T, F> {
    T convert(F f);
}

// 使用
public void test1() {
    Converter<String, Integer> converter = String::valueOf;
    System.out.println(converter.convert(28834));
}
// 3、内置函数式接口
public void test2() {

    // Predicate是一个接口,在这里直接对其做了实现
    Predicate<String> predicate = (s) -> s.length() > 0;
    predicate.test("foo");              // true

    // Function 函数式接口的作用是,为其提供一个原料,生产一个最终的产品
    Function<String, Integer> toInteger = Integer::valueOf;
    toInteger.apply("123");

    // Supplier 与 Function 不同,不接受入参,直接为生产一个指定的结果
    Supplier<String> supplier = String::new;
    supplier.get();

    // 对于Consumer,需要提供入参,用来被消费
    Consumer<BigDecimal> consumer = (s) -> s.toString();
    consumer.accept(new BigDecimal("100"));
}
// 4、Optional 它不是一个函数式接口,设计它的目的是为了防止空指针异常
public void test3() {
    Optional<String> optional = Optional.of("hdfjf");
    optional.orElse("fail");
    optional.get();
    optional.ifPresent(System.out::println);
    optional.orElseThrow(RuntimeException::new);
}

// 5、Stream 流
public void test4() {

    // Filter 过滤
    // Sorted 排序
    // Map 转换
    // Match 匹配
    // Count 计数

    List<String> list = Arrays.asList("a", "bg", "cc");
    list.stream().filter(s -> s.startsWith("s"))
            .sorted()
            .map(s -> s + "1")
            .anyMatch((s) -> s.length() > 0);

    // reduce通过入参的 Function将 list 归约成一个值
    list.stream().reduce((s1, s2) -> s1 + "#" + s2);


    // Parallel-Streams 并行流,通过多线程来处理的,能够充分利用物理机 多核 CPU 的优势
    list.parallelStream().sorted();
}

// 6、 map 集合,JDK 8 中对map提供了一些其他新特性
public void test5() {

    Map<Integer, String> map = new HashMap<>();
    map.putIfAbsent(1, "i");

    // computeIfPresent(), 当 key 存在时,才会做相关处理key和value
    map.computeIfPresent(3, (num, val) -> val + num);
    map.get(3);

    // 先判断 key 为 9 的元素是否存在,存在,则做删除操作
    map.computeIfPresent(1, (num, val) -> null);
    map.containsKey(1);     // false

    // computeIfAbsent(), 当 key 不存在时,才会做相关处理
    map.computeIfAbsent(23, num -> "val" + num);
    map.containsKey(23);    // true

}

// 7、新版日期处理 Clock
public void test6() {

    Clock clock = Clock.systemDefaultZone();
    long millis = clock.millis();

    // 老版本 java.util.Date
    Instant instant = clock.instant();
    Date legacyDate = Date.from(instant);


    // Timezone时区
    ZoneId zone1 = ZoneId.of("Europe/Berlin");
    ZoneId zone2 = ZoneId.of("Brazil/East");

    // Localtime
    LocalTime now1 = LocalTime.now(zone1);
    LocalTime now2 = LocalTime.now(zone2);

    // LocalDate
    LocalDate today = LocalDate.now();
    LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS);
    LocalDate yesterday = tomorrow.minusDays(2);

    LocalDate independenceDay = LocalDate.of(2019, Month.FEBRUARY, 4);
    DayOfWeek dayOfWeek = independenceDay.getDayOfWeek();
}
// 8、注解可重复
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value();// 定义一个属性值
}

// 老板需要定义一个注解容器,才允许在同一个方法上重复使用注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotationContainer {
    MyAnnotation[] value();
}

@MyAnnotationContainer({@MyAnnotation("he"), @MyAnnotation("hh")})
public void test8() {

}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotationContainer1 {
    MyAnnotation1[] value();
}

@Target(ElementType.METHOD) // 使用范围在类、接口和枚举
@Retention(RetentionPolicy.RUNTIME) // 生命周期在运行时期,可以进行反射操作
@Repeatable(MyAnnotationContainer1.class) // 重复注解,需要指定注解容器
public @interface MyAnnotation1 {
    String value();// 定义一个属性值
}

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值