jdk8新特性

jdk8

1,lambda表达式

​ lambda表达式一般是和函数式接口一起使用的,函数式接口就是只有一个抽象方法的接口,这里需要注意的是object中的方法是可以在函数式接口中重写的

如果不使用lambda表达式的话,我们可以这样写:

public interface AcanthopanaxInterface {

    /**
     * 测试
     */
    void get();
}

public class Test1 {
    public static void main(String[] args) {
        new AcanthopanaxInterface(){
            @Override
            public void get() {
                System.out.println("aaa");
            }
        }.get();
    }
}
使用匿名内部类的方式:创建这个接口,然后实现抽象方法,最后调用即可
①无参方法

这里这样写是因为没有返回值类型,如果有返回值的话,那么就需要一个变量来进行接收。

如果方法体中只有一行代码的话,那么{}就可以省略不写了

接口名 方法参数 方法体
((AcanthopanaxInterface) () -> System.out.println("aaa")).get();
②有参有返回值的方法

这个和无参的时候是一样的,只不过需要有一个返回值,并且如果方法体中只有一行返回值的代码的时候,return也是可以省略的

public interface YouShenInterface {

    String get(int i, int j);
}

public class Test2 {
    public static void main(String[] args) {

        System.out.println(((YouShenInterface) (i, j) -> i + "-" + j).get(1, 1));
    }
}
③lambda来遍历集合
public class Test3 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("123");
        list.add("456");
        list.add("789");
        list.forEach((s) -> System.out.println(s));
    }
}

或者有一种更简单的方法:
public class Test3 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("123");
        list.add("456");
        list.add("789");
        list.forEach(System.out::println);
    }
}
④lambda集合排序
public class UserEntity {
    private String name;
    private Integer age;

    public UserEntity(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "UserEntity{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}


public class Test4 {
    public static void main(String[] args) {
        ArrayList<UserEntity> userlists = new ArrayList<>();
        userlists.add(new UserEntity("mayikt", 22));
        userlists.add(new UserEntity("xiaomin", 18));
        userlists.add(new UserEntity("xiaoha", 36));

        userlists.sort((o1, o2) ->
                o1.getAge() - o2.getAge()
        );
        userlists.forEach((Consumer) o -> System.out.println("o:" + o.toString()));

    }
}
⑤线程调用
public class Test5 {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("我是子线程1");
            }
        }).start();
        new Thread(()-> System.out.println("我是子线程2")).start();
    }
}

2,stream流

​ Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

​ 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

​ 元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

Stream :非常方便精简的形式遍历集合实现 过滤、排序等。

Stream创建方式:

  • parallelStream为并行流采用多线程执行
  • Stream采用单线程执行

parallelStream效率比Stream要高。

①Stream将list转换为Set
public class Test01 {
    public static void main(String[] args) {
        ArrayList<UserEntity> userEntities = new ArrayList<>();
        userEntities.add(new UserEntity("mayikt", 20));
        userEntities.add(new UserEntity("meite", 28));
        userEntities.add(new UserEntity("zhangsan", 35));
        userEntities.add(new UserEntity("xiaowei", 16));
        userEntities.add(new UserEntity("xiaowei", 16));
        userEntities.forEach((t) -> {
            System.out.println(t.toString());
        });
        System.out.println("取出重复...");

        Stream<UserEntity> stream = userEntities.stream();
        // 转换成set集合
        Set<UserEntity> setUserList = stream.collect(Collectors.toSet());
        setUserList.forEach(userEntity -> System.out.println(userEntity.toString()));
    }
}
②Stream将list转换为Map
public static void main(String[] args) {
        ArrayList<UserEntity> userEntities = new ArrayList<UserEntity>();
        userEntities.add(new UserEntity("mayikt", 20));
        userEntities.add(new UserEntity("meite", 28));
        userEntities.add(new UserEntity("zhangsan", 35));
        userEntities.add(new UserEntity("xiaowei", 16));
        Stream<UserEntity> stream = userEntities.stream();
        // key 为string类型 value UserEntity  集合中的数据:UserEntity , string类型
        Map<String, UserEntity> collect = stream.collect(Collectors.toMap(new Function<UserEntity, String>() {
            @Override
            public String apply(UserEntity userEntity) {
                return userEntity.getUserName();
            }
        }, new Function<UserEntity, UserEntity>() {
            @Override
            public UserEntity apply(UserEntity userEntity) {
                return userEntity;
            }
        }));
        collect.forEach(new BiConsumer<String, UserEntity>() {
            @Override
            public void accept(String s, UserEntity userEntity) {
                System.out.println(s + "\t:\t" + userEntity.toString());
            }
        });
    }
③Stream将Reduce 求和
public static void main(String[] args) {
    Stream<Integer> integerStream = Stream.of(10, 30, 80, 60, 10, 70);
    Optional<Integer> reduce = integerStream.reduce((a1, a2) -> a1 + a2);
    System.out.println(reduce.get());
}
④StreamMax和Min

注意:stream流只能被消费一次,如果还需要使用的话,那么就需要重新创建了。

public static void main(String[] args) {
    ArrayList<UserEntity> userEntities = new ArrayList<UserEntity>();
    userEntities.add(new UserEntity("mayikt", 20));
    userEntities.add(new UserEntity("meite", 28));
    userEntities.add(new UserEntity("zhangsan", 35));
    userEntities.add(new UserEntity("xiaowei", 16));
    Stream<UserEntity> stream1 = userEntities.stream();
    Optional<UserEntity> max = stream1.max(new Comparator<UserEntity>() {
        @Override
        public int compare(UserEntity o1, UserEntity o2) {
            return o1.getAge() - o2.getAge();
        }
    });
    System.out.println(max.get());
    Stream<UserEntity> stream2 = userEntities.stream();
        Optional<UserEntity> min = stream2.min(((o1, o2) -> o1.getAge() - o2.getAge()));
    System.out.println(min.get());
}
⑤StreamMatch 匹配

anyMatch表示,判断的条件里,任意一个元素成功,返回true

allMatch表示,判断条件里的元素,所有的都是,返回true

noneMatch跟allMatch相反,判断条件里的元素,所有的都不是,返回true

public static void main(String[] args) {
    ArrayList<UserEntity> userEntities = new ArrayList<UserEntity>();
    userEntities.add(new UserEntity("mayikt", 20));
    userEntities.add(new UserEntity("meite", 28));
    userEntities.add(new UserEntity("zhangsan", 35));
    userEntities.add(new UserEntity("xiaowei", 16));
    Stream<UserEntity> stream = userEntities.stream();
    boolean result = stream.noneMatch(new Predicate<UserEntity>() {
        @Override
        public boolean test(UserEntity userEntity) {
            return userEntity.getAge() > 35;
        }
    });
    System.out.println(result);
    Stream<UserEntity> stream2 = userEntities.stream();
    boolean result2 = stream2.noneMatch((user) -> user.getAge() > 35);
    System.out.println(result2);
}
⑥StreamFor循环
public static void main(String[] args) {
    ArrayList<UserEntity> userEntities = new ArrayList<UserEntity>();
    userEntities.add(new UserEntity("mayikt", 20));
    userEntities.add(new UserEntity("meite", 28));
    userEntities.add(new UserEntity("zhangsan", 35));
    userEntities.add(new UserEntity("xiaowei", 16));
    Stream<UserEntity> stream = userEntities.stream();
    stream.forEach(new Consumer<UserEntity>() {
        @Override
        public void accept(UserEntity userEntity) {
            System.out.println(userEntity.toString());
        }
    });
    Stream<UserEntity> stream2 = userEntities.stream();
    stream2.forEach(userEntity -> System.out.println(userEntity.toString()));
}
⑦Stream过滤器
public static void main(String[] args) {
    ArrayList<UserEntity> userEntities = new ArrayList<UserEntity>();
    userEntities.add(new UserEntity("mayikt", 20));
    userEntities.add(new UserEntity("meite", 28));
    userEntities.add(new UserEntity("zhangsan", 35));
    userEntities.add(new UserEntity("xiaowei", 16));
    Stream<UserEntity> stream = userEntities.stream();
    stream.filter(new Predicate<UserEntity>() {
        @Override
        public boolean test(UserEntity userEntity) {
            return userEntity.getAge() >= 35;
        }
    }).filter(new Predicate<UserEntity>() {
        @Override
        public boolean test(UserEntity userEntity) {
            return userEntity.getUserName().equals("zhangsan");
        }
    }).forEach(new Consumer<UserEntity>() {
        @Override
        public void accept(UserEntity userEntity) {
            System.out.println(userEntity.toString());
        }
    });

    Stream<UserEntity> stream2 = userEntities.stream();
    stream2.filter((userEntity -> userEntity.getAge() >= 35)).filter(userEntity -> userEntity.equals("zhangsan"))
            .forEach((userEntity -> System.out.println(userEntity)));
}
⑧Stream排序 sorted
public static void main(String[] args) {
    ArrayList<UserEntity> userEntities = new ArrayList<UserEntity>();
    userEntities.add(new UserEntity("mayikt", 20));
    userEntities.add(new UserEntity("meite", 28));
    userEntities.add(new UserEntity("zhangsan", 35));
    userEntities.add(new UserEntity("xiaowei", 16));
    Stream<UserEntity> stream = userEntities.stream();
    stream.sorted(new Comparator<UserEntity>() {
        @Override
        public int compare(UserEntity o1, UserEntity o2) {
            return o1.getAge() - o2.getAge();
        }
    }).forEach(new Consumer<UserEntity>() {
        @Override
        public void accept(UserEntity userEntity) {
            System.out.println(userEntity.toString());
        }
    });
    Stream<UserEntity> stream2 = userEntities.stream();
    stream2.sorted(((o1, o2) -> o1.getAge() - o2.getAge())).forEach(userEntity -> System.out.println(userEntity.toString()));
}
⑨Stream limit和skip

Limit 从头开始获取

Skip 就是跳过

public static void main(String[] args) {
    ArrayList<UserEntity> userEntities = new ArrayList<UserEntity>();
    userEntities.add(new UserEntity("mayikt", 20));
    userEntities.add(new UserEntity("meite", 28));
    userEntities.add(new UserEntity("zhangsan", 35));
    userEntities.add(new UserEntity("xiaowei", 16));
    Stream<UserEntity> stream = userEntities.stream();
    stream.skip(2).limit(1).forEach(userEntity -> System.out.println(userEntity));
}
⑩Stream 综合案例

要求:对数据流的数据实现降序排列、且名称包含mayikt 获取前两位

public static void main(String[] args) {
    ArrayList<UserEntity> userEntities = new ArrayList<>();
    userEntities.add(new UserEntity("mayikt", 20));
    userEntities.add(new UserEntity("meite", 28));
    userEntities.add(new UserEntity("zhangsan", 35));
    userEntities.add(new UserEntity("xiaowei", 16));
    userEntities.add(new UserEntity("mayikt_list", 109));
    userEntities.add(new UserEntity("mayikt_zhangsan", 110));
    userEntities.add(new UserEntity("lisi", 109));
    //要求:对数据流的数据实现降序排列、且名称包含mayikt 获取前两位
    userEntities.stream().filter(userEntity -> userEntity.getUserName().contains("mayikt_")).limit(2)
            .sorted((o1, o2) -> o1.getAge() - o2.getAge())
            .forEach(userEntity -> System.out.println(userEntity.toString()));

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JDK 8,也就是 Java Development Kit 8,有许多新的特性。以下是其中一些主要的新特性: 1. **Lambda 表达式和函数式接口**:这是 JDK 8 中最重要的新特性之一。Lambda 表达式允许开发者以更简洁的方式编写代码,通过使用匿名函数来实现。此外,JDK 8 还引入了函数式接口(如 `Supplier`, `Function`, `Consumer`, `BiFunction` 等),它们允许开发者创建更复杂的功能块。 2. **Stream API**:Java Stream API 是 JDK 8 中另一个重要的新特性。它提供了一种对数据进行操作和处理的方式,这种处理方式更接近于其他编程语言的数据处理库。 3. **新的集合类**:JDK 8 引入了一些新的集合类,如 `NavigableSet`, `ConcurrentHashMap` 等,这些类提供了更高效的数据结构和性能。 4. **G1垃圾收集器**:JDK 8 中的 G1垃圾收集器是一个可预测的、并行化的垃圾收集器,提供了更好的性能和响应时间。 5. **日期和时间 API**:JDK 8 引入了一个新的日期和时间 API,它提供了更简单、更一致的方式来处理日期和时间。 6. **模块系统**:Java 模块系统是 JDK 8 中的另一个新特性,它允许开发者创建独立的、可移植的软件包。 7. **流处理框架**:JDK 8 中的流处理框架 Stream API 支持用户自定义的流处理操作符,这使得开发者可以创建更复杂的流处理程序。 8. **新的异常处理机制**:JDK 8 中的新异常处理机制允许开发者使用 lambda 表达式来声明和处理异常。 9. **改进的 JDBC API**:JDK 8 中的 JDBC API 提供了一个更简单、更直观的方式来访问数据库。 以上就是 JDK 8 中一些主要的新特性,这些特性都为开发者提供了更高效、更简洁的开发体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值