zoukankan      html  css  js  c++  java
  • java Lambda

    源码

    package com.keyba.example;
    
    import java.util.*;
    import java.util.function.Consumer;
    import java.util.function.Predicate;
    import java.util.stream.Collectors;
    
    
    public class LambdaTest {
        public static void main(String[] args) {
            String[] atp = {"Rafael Nadal", "Novak Djokovic", "Stanislas Wawrinka", "David Ferrer",
                    "Roger Federer", "Andy Murray", "Tomas Berdych", "Juan Martin Del Potro"};
            List<String> players = Arrays.asList(atp);
    
            // 以前的循环方式
            for (String player : players) {
                System.out.print(player + "; ");
            }
            System.out.println();
    
            // 使用 lambda 表达式以及函数操作(functional operation)
            players.forEach((player) -> System.out.print(player + "; "));
    
            System.out.println();
            // 在 Java 8 中使用双冒号操作符(double colon operator)
            players.forEach(System.out::println);
        }
    
    }
    
    class AcceptMethod {
        public static void printValue(String str) {
            System.out.println("print value : " + str);
        }
    }
    
    class MyTest {
        public static void main(String[] args) {
            List<String> al = Arrays.asList("a", "b", "c", "d");
            al.forEach(AcceptMethod::printValue);
            //下面的方法和上面等价的
            Consumer<String> methodParam = AcceptMethod::printValue; //方法参数
            al.forEach(x -> methodParam.accept(x));//方法执行accept
        }
    }
    
    class Employee {
        private String firstName, lastName, job, gender;
        private int salary, age;
    
        public Employee(String firstName, String lastName, String job,
                        String gender, int age, int salary) {
            this.firstName = firstName;
            this.lastName = lastName;
            this.gender = gender;
            this.age = age;
            this.job = job;
            this.salary = salary;
        }
    
        public String getFirstName() {
            return firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public String getJob() {
            return job;
        }
    
        public String getGender() {
            return gender;
        }
    
        public void setSalary(int salary) {
            this.salary = salary;
        }
    
        public int getSalary() {
            return salary;
        }
    
        public int getAge() {
            return age;
        }
    
        public static void main(String[] args) {
            List<Employee> javaProgrammers = new ArrayList<Employee>() {
                {
                    add(new Employee("Elsdon", "Jaycob", "Java programmer", "male", 43, 2000));
                    add(new Employee("Tamsen", "Brittany", "Java programmer", "female", 23, 1500));
                    add(new Employee("Floyd", "Donny", "Java programmer", "male", 33, 1800));
                    add(new Employee("Sindy", "Jonie", "Java programmer", "female", 32, 1600));
                    add(new Employee("Vere", "Hervey", "Java programmer", "male", 22, 1200));
                    add(new Employee("Maude", "Jaimie", "Java programmer", "female", 27, 1900));
                    add(new Employee("Shawn", "Randall", "Java programmer", "male", 30, 2300));
                    add(new Employee("Jayden", "Corrina", "Java programmer", "female", 35, 1700));
                    add(new Employee("Palmer", "Dene", "Java programmer", "male", 33, 2000));
                    add(new Employee("Addison", "Pam", "Java programmer", "female", 34, 1300));
                }
            };
    
            System.out.println("所有程序员的姓名:");
            javaProgrammers.forEach((p) -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));
            System.out.println();
            System.out.println("给程序员加薪 5% :");
            javaProgrammers.forEach(p -> System.out.printf(String.valueOf(p.getSalary()) + "; "));
            Consumer<Employee> giveRaise = e -> e.setSalary(e.getSalary() / 100 * 5 + e.getSalary());
            javaProgrammers.forEach(giveRaise);
            System.out.println();
            javaProgrammers.forEach(p -> System.out.printf(String.valueOf(p.getSalary()) + "; "));
            System.out.println();
            System.out.println("下面是月薪超过 $1,400 的JAVA程序员:");
            javaProgrammers.stream()
                    .filter((p) -> (p.getSalary() > 1400))
                    .forEach((p) -> System.out.printf("%s %s %s; ", p.getFirstName(), p.getLastName(), p.getSalary()));
            System.out.println();
            // 定义 filters
            Predicate<Employee> ageFilter = (p) -> (p.getAge() > 25);
            Predicate<Employee> salaryFilter = (p) -> (p.getSalary() > 1400);
            Predicate<Employee> genderFilter = (p) -> ("female".equals(p.getGender()));
    
            System.out.println("年龄大于 24岁的女性 Java programmers:");
            javaProgrammers.stream()
                    .filter(ageFilter)
                    .filter(salaryFilter)
                    .filter(genderFilter)
                    .forEach((p) -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));
            System.out.println();
            System.out.println("根据 salary 排序 Java programmers:");
            List<Employee> sortedJavaProgrammers = javaProgrammers
                    .stream()
                    .sorted((p, p2) -> (p.getSalary() - p2.getSalary()))
                    .limit(3)
                    .collect(Collectors.toList());
    
            sortedJavaProgrammers.forEach((p) -> System.out.printf("%s %s;%s %n", p.getFirstName(), p.getLastName(), p.getSalary()));
    
            System.out.println("将 Java programmers 的 first name 拼接成字符串:");
            String javaDevelopers = javaProgrammers
                    .stream()
                    .map(Employee::getFirstName)
                    .collect(Collectors.joining(" ; ")); // 在进一步的操作中可以作为标记(token)
            System.out.println(javaDevelopers);
    
            System.out.println("将 Java programmers 的 first name 存放到 Set:");
            Set<String> javaDevFirstName = javaProgrammers
                    .stream()
                    .map(Employee::getFirstName)
                    .collect(Collectors.toSet());
            System.out.println(javaDevFirstName);
    
            System.out.println("将 Java programmers 的 first name 存放到 TreeSet:");
            TreeSet<String> javaDevLastName = javaProgrammers
                    .stream()
                    .map(Employee::getLastName)
                    .collect(Collectors.toCollection(TreeSet::new));
            System.out.println(javaDevLastName);
            System.out.println("计算付给 Java programmers 的所有money:");
            int totalSalary = javaProgrammers
                    .parallelStream()
                    .mapToInt(p -> p.getSalary())
                    .sum();
            System.out.println(totalSalary);
            //计算 count, min, max, sum, and average for numbers
            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());
        }
    }
    

    结果

    所有程序员的姓名:
    Elsdon Jaycob; Tamsen Brittany; Floyd Donny; Sindy Jonie; Vere Hervey; Maude Jaimie; Shawn Randall; Jayden Corrina; Palmer Dene; Addison Pam; 
    给程序员加薪 5% :
    2000; 1500; 1800; 1600; 1200; 1900; 2300; 1700; 2000; 1300; 
    2100; 1575; 1890; 1680; 1260; 1995; 2415; 1785; 2100; 1365; 
    下面是月薪超过 $1,400 的JAVA程序员:
    Elsdon Jaycob 2100; Tamsen Brittany 1575; Floyd Donny 1890; Sindy Jonie 1680; Maude Jaimie 1995; Shawn Randall 2415; Jayden Corrina 1785; Palmer Dene 2100; 
    年龄大于 24岁的女性 Java programmers:
    Sindy Jonie; Maude Jaimie; Jayden Corrina; 
    根据 salary 排序 Java programmers:
    Vere Hervey;1260 
    Addison Pam;1365 
    Tamsen Brittany;1575 
    将 Java programmers 的 first name 拼接成字符串:
    Elsdon ; Tamsen ; Floyd ; Sindy ; Vere ; Maude ; Shawn ; Jayden ; Palmer ; Addison
    将 Java programmers 的 first name 存放到 Set:
    [Elsdon, Shawn, Palmer, Addison, Maude, Floyd, Vere, Tamsen, Jayden, Sindy]
    将 Java programmers 的 first name 存放到 TreeSet:
    [Brittany, Corrina, Dene, Donny, Hervey, Jaimie, Jaycob, Jonie, Pam, Randall]
    计算付给 Java programmers 的所有money:
    18165
    List中最大的数字 : 10
    List中最小的数字 : 1
    所有数字的总和   : 55
    所有数字的平均值 : 5.5
    
  • 相关阅读:
    UVA 11488 Hyper Prefix Sets (字典树)
    UVALive 3295 Counting Triangles
    POJ 2752 Seek the Name, Seek the Fame (KMP)
    UVA 11584 Partitioning by Palindromes (字符串区间dp)
    UVA 11100 The Trip, 2007 (贪心)
    JXNU暑期选拔赛
    计蒜客---N的-2进制表示
    计蒜客---线段的总长
    计蒜客---最大质因数
    JustOj 2009: P1016 (dp)
  • 原文地址:https://www.cnblogs.com/liehen2046/p/11058464.html
Copyright © 2011-2022 走看看