Java Lambda表达式学习

本文介绍如何使用Java 8中的Lambda表达式简化集合操作,包括循环、排序、过滤、限制等常见任务,并演示了如何利用Stream API进行高效的数据处理。

原文地址:https://blog.youkuaiyun.com/renfufei/article/details/24600507

基本的Lambda循环
// Old looping
    for (String player : players) {
        System.out.print(player + "; ");
    }

    System.out.println("");

    // Using lambda expression and functional operations
    players.forEach((player) -> System.out.print(player + "; "));

    System.out.println("");

    // Using double colon operator in Java 8
    players.forEach(System.out::println);

使用Lombda排序集合
// 1.2 使用 lambda expression 排序 players
Comparator<String> sortByName = (String s1, String s2) -> (s1.compareTo(s2));
Arrays.sort(players, sortByName);
// 1.3 也可以采用如下形式:
Arrays.sort(players, (String s1, String s2) -> (s1.compareTo(s2)));

原文有更加详细的翻译,这里只是做一个留下一个印象

使用Lambdas和Streams
使用lambdas可以支持许多操作,如 map, filter, limit, sorted, count, min, max, sum, collect 等等。

过滤器

    过滤器
     System.out.println("下面是月薪超过 $1,400 的PHP程序员:")
     phpProgrammers.stream()
      .filter((p) -> (p.getSalary() > 1400))
      .forEach((p) -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));
      过滤器在处理信息中有很大方便的方面。
      // 定义 filters
      Predicate<Person> ageFilter = (p) -> (p.getAge() > 25);
      Predicate<Person> salaryFilter = (p) -> (p.getSalary() > 1400);
      Predicate<Person> genderFilter = (p) ->  ("female".equals(p.getGender()));
      System.out.println("下面是年龄大于 24岁且月薪在$1,400以上的女PHP程序员:");
      phpProgrammers.stream()
      .filter(ageFilter)
      .filter(salaryFilter)
      .filter(genderFilter)
      .forEach((p) -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));

使用limit,限制个数

limit
System.out.println("最前面的3个 Java programmers:");
javaProgrammers.stream()
      .limit(3)
      .forEach((p) -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));
      System.out.println("最前面的3个女性 Java programmers:")
      javaProgrammers.stream()
      .filter(genderFilter)
      .limit(3)
      .forEach((p) -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));

比排序后选择第一个/最后一个 更快的是min和max方法:

min 和max
System.out.println("工资最低的 Java programmer:"); 
Person pers = javaProgrammers
      .stream()
      .min((p1, p2) -> (p1.getSalary() - p2.getSalary()))
      .get()
      System.out.printf("Name: %s %s; Salary: $%,d.", pers.getFirstName(), pers.getLastName(), pers.getSalary())
      System.out.println("工资最高的 Java programmer:");
      Person person = javaProgrammers
      .stream()
      .max((p, p2) -> (p.getSalary() - p2.getSalary()))
      .get()

结合 map 方法,我们可以使用 collect 方法来将我们的结果集放到一个字符串,一个 Set 或一个TreeSet中:(有用)

  .map的使用
  System.out.println("将 PHP programmers 的 first name 拼接成字符串:");
  String phpDevelopers = phpProgrammers
      .stream()
      .map(Person::getFirstName)
      .collect(joining(" ; ")); // 在进一步的操作中可以作为标记(token)   
      System.out.println("将 Java programmers 的 first name 存放到 Set:");
      Set<String> javaDevFirstName = 
      javaProgrammers
      .stream()
      .map(Person::getFirstName)
      .collect(toSet());
     
      System.out.println("将 Java programmers 的 first name 存放到 TreeSet:");
     
      TreeSet<String> javaDevLastName = javaProgrammers
                                       .stream()
                                      .map(Person::getLastName)
                                      .collect(toCollection(TreeSet::new));

在Lambda中还可以将几个结合起来用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值