java8 lambda表达式和stream

java8 lambda表达式

1. Lambda表达式的语法

基本语法:
(parameters) -> expression

(parameters) ->{ statements; }

// 1. 不需要参数,返回值为 5
() -> 5

// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x

// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y

// 4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y

// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)

2. Lambda表达式的基本实例

  • lambda的循环遍历
  String[] atp = {
            "Rafael Nadal", "Novak Djokovic",
            "Stanislas Wawrinka",
            "David Ferrer", "Roger Federer",
            "Andy Murray", "Tomas Berdych",
            "Juan Martin Del Potro"
    };

    @Test
    public void testForeach() {
        List<String> players = Arrays.asList(atp);
        //使用lambda表达对list进行迭代
        players.forEach(player -> System.out.println(player));
        System.out.println("--------------------");
        // 在 Java 8 中使用双冒号操作符(double colon operator)
        players.forEach(System.out::println);
    }
  • lambda字符串排序
/**
     * 测试lambda表达式在列表排序中的应用
     */
    @Test
    public void testSort() {


        //之前常用的排序算法
       /* Arrays.sort(atp, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });
*/

//        Arrays.sort(atp, (String s1, String s2) -> (s1.compareTo(s2)));
//        List<String> players = Arrays.asList(atp);
        System.out.println("-------");

        Comparator<String> sort = (String s1, String s2) -> (s1.compareTo(s2));
        Arrays.sort(atp, sort);
        List<String> players = Arrays.asList(atp);
        players.forEach(player -> System.out.println(player));
    }

3. Lambdas 和streams结合

Stream是对集合的包装,通常和lambda一起使用。 使用lambdas可以支持许多操作,如 map, filter, limit, sorted, count, min, max, sum, collect 等等,Stream使用懒运算,他们并不会真正地读取所有数据,只在使用到相应数据才进行加载!

@Test
    public void lambdaAndStreamTest() {
        List<Person> javaProgrammers = new ArrayList<Person>() {
            {
                add(new Person("Elsdon", "Jaycob", "Java programmer", "male", 43, 2000));
                add(new Person("Tamsen", "Brittany", "Java programmer", "female", 23, 1500));
                add(new Person("Floyd", "Donny", "Java programmer", "male", 33, 1800));
                add(new Person("Sindy", "Jonie", "Java programmer", "female", 32, 1600));
                add(new Person("Vere", "Hervey", "Java programmer", "male", 22, 1200));
                add(new Person("Maude", "Jaimie", "Java programmer", "female", 27, 1900));
                add(new Person("Shawn", "Randall", "Java programmer", "male", 30, 2300));
                add(new Person("Jayden", "Corrina", "Java programmer", "female", 35, 1700));
                add(new Person("Palmer", "Dene", "Java programmer", "male", 33, 2000));
                add(new Person("Addison", "Pam", "Java programmer", "female", 34, 1300));
            }
        };

        List<Person> phpProgrammers = new ArrayList<Person>() {
            {
                add(new Person("Jarrod", "Pace", "PHP programmer", "male", 34, 1550));
                add(new Person("Clarette", "Cicely", "PHP programmer", "female", 23, 1200));
                add(new Person("Victor", "Channing", "PHP programmer", "male", 32, 1600));
                add(new Person("Tori", "Sheryl", "PHP programmer", "female", 21, 1000));
                add(new Person("Osborne", "Shad", "PHP programmer", "male", 32, 1100));
                add(new Person("Rosalind", "Layla", "PHP programmer", "female", 25, 1300));
                add(new Person("Fraser", "Hewie", "PHP programmer", "male", 36, 1100));
                add(new Person("Quinn", "Tamara", "PHP programmer", "female", 21, 1000));
                add(new Person("Alvin", "Lance", "PHP programmer", "male", 38, 1600));
                add(new Person("Evonne", "Shari", "PHP programmer", "female", 40, 1800));
            }
        };

        System.out.println("输出所有程序员的姓名:");
        javaProgrammers.forEach((person) -> System.out.printf("%s %s;", person.getFirstName(), person.getLastNmae()));
        System.out.println();
        phpProgrammers.forEach((person) -> System.out.printf("%s %s;", person.getFirstName(), person.getLastNmae()));

        System.out.println("给程序员加薪5%");
        Consumer<Person> getRais = e -> e.setSalary(e.getSalary() / 100 * 5 + e.getSalary());

        javaProgrammers.forEach(getRais);
        phpProgrammers.forEach(getRais);

        javaProgrammers.forEach((person) -> System.out.println(person.getFirstName() + " " + person.getLastNmae()  +" " + person.getSalary()));
        System.out.println();
        phpProgrammers.forEach((person) -> System.out.println(person.getFirstName() + " " + person.getLastNmae() + " " + person.getSalary()));

        // stream 中的filter来过滤数据
        System.out.println("显示月薪超过1400美元的php程序员");
        phpProgrammers.stream().filter((person -> (person.getSalary() > 1400))).forEach((person -> System.out.printf("%s %s,", person.getFirstName(), person.getLastNmae())));

 //使用limit方法,来限制结果的个数
        System.out.println("输出女java程序员的前两个");

        javaProgrammers.stream().filter(genderFilter).limit(2).forEach(person -> System.out.println(person.getFirstName() + " " + person.getLastNmae()));

        //根据 name 排序,并显示前5个 Java programmers
        List<Person> sortedJavaProgrammers = javaProgrammers.stream().sorted((p1, p2) -> (p1.getFirstName()).compareTo(p2.getFirstName())).limit(2).collect(Collectors.toList());
        System.out.println(sortedJavaProgrammers);
        List<Person> sortedJavaBySalary = javaProgrammers.stream().sorted((p1, p2) -> (p1.getSalary() - p2.getSalary())).limit(2).collect(Collectors.toList());
        System.out.println("按照工资排序的前两个" + sortedJavaBySalary);

        //如果我们只对最低和最高的薪水感兴趣,比排序后选择第一个/最后一个 更快的是min和max方法:
        System.out.println("工资最低的java programmer");
        Person person = javaProgrammers.stream().min((p1, p2) -> (p1.getSalary() - p2.getSalary())).get();
        System.out.println("工资 最低的java程序员是:" + person);

        System.out.println("工资最好的java程序员是:");
        Person person1 = javaProgrammers.stream().max((p1, p2) -> (p1.getSalary() - p2.getSalary())).get();
        System.out.println(person1);
    }
    
   

结合 map 方法,我们可以使用 collect 方法来将我们的结果集放到一个字符串,一个 Set 或一个TreeSet中.以及在streams中并行的计算数据

    @Test
    public void sortTest() {
        System.out.println("将PHP programmers 的first name 拼接成字符串:");
        String phpDevlopers = phpProgrammers.stream().map(Person::getFirstName).collect(Collectors.joining(";"));
        System.out.println(phpDevlopers);
        System.out.println("将PHP programmers 的first name 放入set:");
        Set<String> javaDevloperFirstName = javaProgrammers.stream().map(Person::getFirstName).collect(Collectors.toSet());
        System.out.println(javaDevloperFirstName);

        System.out.println("将PHP programmers 的first name 放入Treeset:");
        TreeSet<String> javaProgram =
                javaProgrammers.stream().map(Person::getFirstName).collect(Collectors.toCollection(TreeSet::new));
        System.out.println(javaProgram);

        //Streams 还可以是并行的(parallel)计算
        System.out.println("计算付给JavaProgrammers的所有money:");
        int totalsalary = javaProgrammers.parallelStream().mapToInt(p -> p.getSalary()).sum();
        System.out.println(totalsalary);
}

我们可以使用summaryStatistics方法获得stream 中元素的各种汇总数据。 接下来,我们可以访问这些方法,比如getMax, getMin, getSum或getAverage:

 List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        IntSummaryStatistics stats = numbers.stream().mapToInt(x -> x).summaryStatistics();
        System.out.println("List中最大的数字:" + stats.getMax());
        System.out.println("list中最小的数字:" + stats.getMin());
        System.out.println("所有的数字总和:" + stats.getSum());
        System.out.println("所有数字平均值:" + stats.getAverage());

原文链接:https://blog.csdn.net/renfufei/article/details/24600507

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值