likes
comments
collection
share

Java 8 的那些常见写法

作者站长头像
站长
· 阅读数 38

前言

现在Java已经发展到Java19版本了,由于Java后面一些版本,就开始商用收费了,所以目前绝大多数公司的JDK版本都是采用的之前稳定且免费的1.8版本,也就是Java8,这个版本已经能满足几乎所有业务的需求开发了,下面我列举几个Java8中的一些常见写法。

1. 循环遍历

示例:循环打印集合对象信息

常规写法:

for (User user : users) {
	System.out.println(user.toString());
}

Java 8 写法:

users.forEach(o -> System.out.println(o.toString()));

2. 函数式接口:匿名内部类

示例:多线程异步打印

常规写法:

new Thread(new Runnable() {
  @Override
  public void run() {
    System.out.println("hello world");
  }
}).start();

Java 8 写法:

new Thread(() -> System.out.println("hello world")).start();

3. 排序(升序版:从小到大)

示例:用户年龄小到大排序

常规写法:

Collections.sort(userList, new Comparator<User>() {
  @Override
  public int compare(User o1, User o2) {
    return o1.getAge() - o2.getAge();
  }
});

Java 8 写法1:基础版

Collections.sort(userList, (o1, o2) -> o1.getAge() - o2.getAge());

Java 8 写法2:进阶版

Collections.sort(userList, Comparator.comparingInt(User::getAge));

Java 8 写法3:终极版

userList.sort(Comparator.comparingInt(User::getAge));

【注】数值比较可以直接相减排序,非数值比较请用 compareTo() 方法。

【如】 return o1.getName().compareTo(o2.getName());

4. 排序(降序版:从大到小)

示例:用户年龄小到大排序

常规写法:

Collections.sort(userList, new Comparator<User>() {
  @Override
  public int compare(User o1, User o2) {
    return o2.getAge() - o1.getAge();
  }
});

Java 8 写法1:基础版

Collections.sort(userList, (o1, o2) -> o2.getAge() - o1.getAge());

Java 8 写法2:终极版

userList.sort((o1, o2) -> o2.getAge() - o1.getAge());

5. 过滤

示例:过滤年龄小于18的用户

常规写法:

List<User> users = new ArrayList<>();
for(User u: userList){
    if (u.getAge() < 18) {
      users.add(u);
    }
}

Java 8 写法:

List<User> users = userList.stream().filter(u -> u.getAge() < 18).collect(Collectors.toList());

6. 求和

示例:求所有用户的年龄总和

常规写法:

int sum = 0;
for(User u: userList){
    sum += u.getAge();
}
System.out.println("年龄总和 : " + sum);

Java 8 写法:

int sum = userList.stream().mapToInt(User::getAge).sum();
System.out.println("年龄总和 : " + sum);

7. 求最大值

示例:求所有用户中最大年龄

常规写法:

int maxAge = 0;
for(User u: userList){
  if (u.getAge() > maxAge) {
    maxAge = u.getAge();
  }
}
System.out.println("最大年龄 : " + maxAge);

Java 8 写法:

int maxAge = userList.stream().mapToInt(User::getAge).max().getAsInt();
System.out.println("最大年龄 : " + maxAge);

8. 求最小值

示例:求所有用户中最小年龄

常规写法:

int maxAge = Integer.MAX_VALUE;
for(User u: userList){
  if (u.getAge() < maxAge) {
    maxAge = u.getAge();
  }
}
System.out.println("最小年龄 : " + maxAge);

Java 8 写法:

int minAge = userList.stream().mapToInt(User::getAge).min().getAsInt();
System.out.println("最小年龄 : " + minAge);

9. 求平均值

示例:求所有用户平均年龄

常规写法:

int sum = 0;
int size = userList.size();
for(User u: userList){
  sum += u.getAge();
}
double aveAge = (double) sum / size;
System.out.println("平均年龄 : " + aveAge);

Java 8 写法:

double aveAge = userList.stream().mapToInt(User::getAge).average().getAsDouble();
System.out.println("平均年龄 : " + aveAge);

10. 获取属性集合

示例:获取所有用户的 id 集合

常规写法:

List<Long> ids = new ArrayList<>();
for(User u: userList){
    ids.add(u.getId());
}

Java 8 写法:

List<Long> ids = userList.stream().map(User::getId).collect(Collectors.toList());

11. List 转 Map

示例:将所有用户 List 集合转为 Map 集合,且 id 为键

常规写法:

Map<Long, User> userMap = new HashMap<Long, User>();
for (User user : users) {
	userMap.put(user.getId(), user);
}

Java 8 写法:

Map<Long, User> userMap = users.stream().collect(Collectors.toMap(User::getId, Function.identity()));