Java 8 新特性Lambda 表达式
- 一、常用循环
- 二、匿名内部类
- 三、排序集合
- 四、循环打印对象
- 五、根据条件修改
- 六、排序
- 七、求和
- 八、统计方法
- 九、材料
一、常用循环
public class Spring3 {
public static void main(String[] args) {
String[] atp = {"yuanGe",
"daWei",
"xiaoMing"
};
List<String> players = Arrays.asList(atp);
// 以前的循环方式
for (String player : players) {
System.out.println(player + "; ");
}
System.out.println("===================================");
// 使用 lambda 表达式以及函数操作(functional operation)
players.forEach((player) -> System.out.println(player + "; "));
System.out.println("===================================");
// 在 Java 8 中使用双冒号操作符(double colon operator)
players.forEach(System.out::println);
}
}
二、匿名内部类
public class Spring3 {
public static void main(String[] args) {
// 1.1使用匿名内部类
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello world !");
}
}).start();
// 1.2使用 lambda expression
new Thread(() -> System.out.println("Hello world !")).start();
// 2.1使用匿名内部类
Runnable race1 = new Runnable() {
@Override
public void run() {
System.out.println("Hello world !");
}
};
// 2.2使用 lambda expression
Runnable race2 = () -> System.out.println("Hello world !");
// 直接调用 run 方法(没开新线程哦!)
race1.run();
race2.run();
}
}
三、排序集合
public class Spring3 {
public static void main(String[] args) {
String[] atp2 = {"Z","B","C"};
// 1.1 使用匿名内部类根据 name 排序 players
Arrays.sort(atp2, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return (s1.compareTo(s2));
}
});
List<String> players2 = Arrays.asList(atp2);
players2.forEach(System.out::println);
}
}
四、循环打印对象
@AllArgsConstructor//创建带参构造器
@Data//get、set方法,为该类添加equals、canEquals、hashCode、toString方法
@Slf4j//log的Log4J日志对象
public class Person {
@NonNull//属性非空
private String a;
private String b;
private String c;
private String d;
private Integer e;
private Integer f;
}
public class Spring3 {
public static void main(String[] args) {
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));
}
};
javaProgrammers.forEach((p) -> System.out.printf("%s %s; ", p.getA(), p.getB()));
phpProgrammers.forEach((p) -> System.out.printf("%s %s; ", p.getA(), p.getB()));
}
}
总结
for(Object o: list) { // 外部迭代
System.out.println(o);
}
//可以写成:
list.forEach(o -> {System.out.println(o);}); //forEach函数实现内部迭代
五、根据条件修改
filter方法的参数是Predicate类型,forEach方法的参数是Consumer类型,它们都是函数式接口,所以可以使用λ表达式。
将E属性为34的对象将其F属性设置为100
public class Spring3 {
public static void main(String[] args) {
//将E属性为34的对象将其F属性设置为100
phpProgrammers
.stream()
.filter(s -> s.getE() == 34)
.forEach(s -> s.setF(100));
phpProgrammers.forEach(o -> System.out.println(o.toString()));
}
}
六、排序
public class Spring3 {
public static void main(String[] args) {
//根据A列名字排序
List<Person> sortedJavaProgrammers = javaProgrammers
.stream()
.sorted((p, p2) -> (p.getA().compareTo(p2.getA())))
.limit(5)
.collect(Collectors.toList());
sortedJavaProgrammers.forEach((p) -> System.out.printf("%s %s; %n", p.getA(), p.getB()));
//根据F列数字排序
sortedJavaProgrammers = javaProgrammers
.stream()
.sorted((p, p2) -> (p.getF() - p2.getF()))
.collect(Collectors.toList());
sortedJavaProgrammers.forEach((p) -> System.out.printf("%s %s; %n", p.getA(), p.getB()));
}
}
七、求和
上面的例子中我们已经看到 collect 方法是如何工作的。 结合 map 方法,我们可以使用 collect 方法来将我们的结果集放到一个字符串,一个 Set 或一个TreeSet中:
public class Spring3 {
public static void main(String[] args) {
int totalSalary = javaProgrammers
.parallelStream()
.mapToInt(p -> p.getF())
.sum();
System.out.println(totalSalary);
}
}
八、统计方法
public class Spring3 {
public static void main(String[] args) {
//计算 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());
}
}
九、材料
本文一共两个用到两个类
import lombok.*;
import lombok.extern.java.Log;
import lombok.extern.log4j.Log4j;
import lombok.extern.slf4j.Slf4j;
/**
* @author lichangyuan
* @create 2021-09-27 16:34
*/
@AllArgsConstructor//创建带参构造器
@Data//get、set方法,为该类添加equals、canEquals、hashCode、toString方法
@Slf4j//log的Log4J日志对象
@Log
public class Person {
@NonNull//属性非空
private String a;
private String b;
private String c;
private String d;
private Integer e;
private Integer f;
}
import com.example.demo.entity.Person;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author lichangyuan
* @create 2021-09-26 16:44
*/
public class Spring3 {
public static void main(String[] args) {
String[] atp = {"yuanGe",
"daWei",
"xiaoMing"
};
List<String> players = Arrays.asList(atp);
// 以前的循环方式
for (String player : players) {
System.out.println(player + "; ");
}
System.out.println("===================================");
// 使用 lambda 表达式以及函数操作(functional operation)
players.forEach((player) -> System.out.println(player + "; "));
System.out.println("===================================");
// 在 Java 8 中使用双冒号操作符(double colon operator)
players.forEach(System.out::println);
System.out.println("===================================");
// 1.1使用匿名内部类
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello world !");
}
}).start();
// 1.2使用 lambda expression
new Thread(() -> System.out.println("Hello world !")).start();
// 2.1使用匿名内部类
Runnable race1 = new Runnable() {
@Override
public void run() {
System.out.println("Hello world !");
}
};
// 2.2使用 lambda expression
Runnable race2 = () -> System.out.println("Hello world !");
// 直接调用 run 方法(没开新线程哦!)
race1.run();
race2.run();
System.out.println("===================================");
String[] atp2 = {"Z", "B", "C"};
// 1.1 使用匿名内部类根据 name 排序 players
Arrays.sort(atp2, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return (s1.compareTo(s2));
}
});
List<String> players2 = Arrays.asList(atp2);
players2.forEach(System.out::println);
System.out.println("===================================");
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));
}
};
javaProgrammers.forEach((p) -> System.out.printf("%s %s; ", p.getA(), p.getB()));
phpProgrammers.forEach((p) -> System.out.printf("%s %s; ", p.getA(), p.getB()));
System.out.println("===================================");
//根据A列名字排序
List<Person> sortedJavaProgrammers = javaProgrammers
.stream()
.sorted((p, p2) -> (p.getA().compareTo(p2.getA())))
.limit(5)
.collect(Collectors.toList());
sortedJavaProgrammers.forEach((p) -> System.out.printf("%s %s; %n", p.getA(), p.getB()));
//根据F列数字排序
sortedJavaProgrammers = javaProgrammers
.stream()
.sorted((p, p2) -> (p.getF() - p2.getF()))
.collect(Collectors.toList());
sortedJavaProgrammers.forEach((p) -> System.out.printf("%s %s; %n", p.getA(), p.getB()));
System.out.println("===================================");
//将E属性为34的对象将其F属性设置为100
phpProgrammers
.stream()
.filter(s -> s.getE() == 34)
.forEach(s -> s.setF(100));
phpProgrammers.forEach(o -> System.out.println(o.toString()));
System.out.println("===================================");
int totalSalary = javaProgrammers
.parallelStream()
.mapToInt(p -> p.getF())
.sum();
System.out.println(totalSalary);
System.out.println("===================================");
//计算 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());
}
}