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