Java8-lambda表达式
2020-03-23 本文已影响0人
笨鸡
匿名接口方法
package lambda;
public class Lambda1 {
public static void main(String[] args) {
LambdaNoneReturnNoneParameter lambda1 = () ->
System.out.println("LambdaNoneReturnNoneParameter");
lambda1.test();
LambdaNoneReturnSingleParameter lambda2 = a ->
System.out.println("LambdaNoneReturnSingleParameter: " + a);
lambda2.test(10);
LambdaNoneReturnMultiParameter lambda3 = (a, b) ->
System.out.println("LambdaNoneReturnMultiParameter: " + a + ", " + b);
lambda3.test(5, 10);
LambdaHasReturnNoneParameter lambda4 = () -> 10;
System.out.println("LambdaHasReturnNoneParameter: "+ lambda4.test());
LambdaHasReturnSingleParameter lambda5 = a -> a;
System.out.println("LambdaHasReturnSingleParameter: "+ lambda5.test(10));
LambdaHasReturnMultiParameter lambda6 = (a, b) -> a * b;
System.out.println("LambdaHasReturnSingleParameter: "+ lambda6.test(10, 5));
}
}
@FunctionalInterface
interface LambdaNoneReturnNoneParameter {
void test();
}
@FunctionalInterface
interface LambdaNoneReturnSingleParameter {
void test(int a);
}
@FunctionalInterface
interface LambdaNoneReturnMultiParameter {
void test(int a, int b);
}
@FunctionalInterface
interface LambdaHasReturnNoneParameter {
int test();
}
@FunctionalInterface
interface LambdaHasReturnSingleParameter {
int test(int a);
}
@FunctionalInterface
interface LambdaHasReturnMultiParameter {
int test(int a, int b);
}
方法引用
package lambda;
public class Lambda2 {
public static void main(String[] args) {
LambdaHasReturnSingleParameter lambda1 = a -> change(a);
System.out.println("a -> change(a): " + lambda1.test(10));
LambdaHasReturnSingleParameter lambda2 = Lambda2::change;
System.out.println("Lambda2::change: " + lambda2.test(10));
PersonCreator creator = () -> new Person();
PersonCreator creator1 = Person::new;
System.out.println(creator1.getPerson());
PersonCreator2 creator2 = Person::new;
System.out.println(creator2.getPerson("CT", 25));
}
public static int change(int a) {
return a * 10;
}
}
@FunctionalInterface
interface LambdaHasReturnSingleParameter {
int test(int a);
}
@FunctionalInterface
interface PersonCreator{
Person getPerson();
}
@FunctionalInterface
interface PersonCreator2{
Person getPerson(String name, int age);
}
class Person{
private String name;
private int age;
public Person() {
System.out.println("Person无参构造方法执行");
}
public Person(String name, int age) {
System.out.println("Person全参构造方法执行");
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
集合排序与遍历
package lambda;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Lambda3 {
public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<Person>(){{
add(new Person("tom", 10));
add(new Person("john", 17));
add(new Person("tony", 13));
add(new Person("marry", 15));
add(new Person("jack", 12));
}};
list.sort((o1, o2) -> o1.getAge() - o2.getAge());
list.forEach(System.out::println);
list.sort(Comparator.comparingInt(Person::getAge).reversed());
list.forEach(System.out::println);
Collections.sort(list, Comparator.comparingInt(Person::getAge));
list.forEach(System.out::println);
}
}
class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
匿名排序比较
package lambda;
import java.util.Comparator;
import java.util.TreeSet;
public class Lambda4 {
public static void main(String[] args) {
TreeSet<Person> set = new TreeSet<Person>(
Comparator.comparingInt(Person::getAge)){{
add(new Person("tom", 10));
add(new Person("john", 17));
add(new Person("tony", 13));
add(new Person("mark", 13));
add(new Person("marry", 15));
add(new Person("jack", 12));
}};
set.forEach(System.out::println);
TreeSet<Person> set1 = new TreeSet<Person>(
(o1, o2) -> o1.getAge() <= o2.getAge() ? -1 : 1){{
add(new Person("tom", 10));
add(new Person("tony", 13));
add(new Person("john", 17));
add(new Person("mark", 13));
add(new Person("marry", 15));
add(new Person("jack", 12));
}};
set1.forEach(System.out::println);
set1.removeIf(ele -> ele.getAge() > 12);
System.out.println(set1);
}
}
class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
系统内置的一些函数式接口
package lambda;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.*;
public class FunctionalInterface {
public static void main(String[] args) {
// 系统内置的一些函数式接口
// Predicate<T> : 参数T 返回值boolean
// Consumer<T> : 参数T 返回值void
// Function<T, R> : 参数T 返回值R
// Supplier<T> : 参数无 返回值T
// UnaryOperator<T> : 参数T 返回值T
// BinaryOperator<T> : 参数T, T 返回值T
// BiFunction<T, U, R> : 参数T, U 返回值R
// BiPredicate<T, U> : 参数T, U 返回值boolean
// BiConsumer<T, U> : 参数T, U 返回值void
System.out.println(filterNum(Arrays.asList(3, 5, 6, 7, 2, 1), e -> e > 3));
cost(100, m -> System.out.println("cost:" + m));
System.out.println(strHandler("\t\t\tHello World", e -> e.trim()));
System.out.println(createRandom(5, () -> (int) (Math.random() * 100)));
}
public static List<Integer> filterNum(List<Integer> list, Predicate<Integer> predicate) {
List<Integer> newList = new ArrayList<>();
for (Integer integer : list) {
if (predicate.test(integer)) {
newList.add(integer);
}
}
return newList;
}
public static void cost(int money, Consumer<Integer> consumer) {
consumer.accept(money);
}
public static String strHandler(String str, Function<String, String> func) {
return func.apply(str);
}
public static List<Integer> createRandom(int length, Supplier<Integer> supplier) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < length; i++) {
list.add(supplier.get());
}
return list;
}
}
闭包中使用的变量变final修饰的常量
Stream-创建stream
package lambda;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class LambdaStream1 {
public static void main(String[] args) {
// 1.Collection.stream() or Collection.parallelStream()
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream();
Stream<String> stream1 = list.parallelStream();
// 2.Arrays.stream()
Person[] persons = new Person[5];
Stream<Person> stream2 = Arrays.stream(persons);
// 3.Stream.of()
Stream<Integer> stream3 = Stream.of(1, 2, 3);
// 4.创建无限流
// 迭代
Stream<Integer> stream4 = Stream.iterate(0, x -> x + 1);
stream4.limit(10).forEach(System.out::println);
// 生成
Stream<Integer> stream5 = Stream.generate(() -> (int) (Math.random() * 100));
stream5.limit(5).limit(10).forEach(System.out::println);
}
}
Stream-筛选与切片
package lambda;
import java.util.ArrayList;
import java.util.List;
public class Data {
public static List<Employee> eList = null;
public static List<Employee> getEList(){
if(eList == null)
eList = new ArrayList<Employee>(){{
add(new Employee("tom", 10, 12000.00));
add(new Employee("john", 17, 12500.00));
add(new Employee("tony", 13, 17000.00));
add(new Employee("mary", 15, 15000.00));
add(new Employee("mary", 15, 15000.00));
add(new Employee("jack", 12, 13000.00));
}};
return eList;
}
public static List<Employee> getESList(){
if(eList == null)
eList = new ArrayList<Employee>(){{
add(new Employee("tom", 10, 12000.00, Status.BUSY));
add(new Employee("john", 17, 12500.00, Status.FREE));
add(new Employee("tony", 13, 17000.00, Status.VOCATION));
add(new Employee("mary", 15, 15000.00, Status.BUSY));
add(new Employee("mary", 15, 15000.00, Status.FREE));
add(new Employee("jeff", 15, 15000.00, Status.FREE));
add(new Employee("jack", 12, 13000.00, Status.VOCATION));
}};
return eList;
}
}
package lambda;
import java.util.List;
public class LambdaStream2 {
public static void main(String[] args) {
List<Employee> list = Data.getEList();
list.stream().filter(e -> e.getAge() > 12).forEach(System.out::println);
System.out.println("--------------");
list.stream()
.filter(e -> e.getSalary() >= 12000)
.limit(3)
.forEach(System.out::println);
System.out.println("--------------");
list.stream()
.filter(e -> e.getSalary() >= 12000)
.skip(3)
.distinct()
.forEach(System.out::println);
}
}
Stream-映射
package lambda;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class LambdaStream3 {
public static void main(String[] args) {
List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd");
list.stream().map(e -> e.toUpperCase()).forEach(System.out::println);
System.out.println("-----------------");
List<Employee> eList = Data.getEList();
eList.stream().map(e -> e.getName().toUpperCase()).forEach(System.out::println);
System.out.println("-----------------");
list.stream().flatMap(LambdaStream3::filterCharacter).forEach(System.out::println);
}
public static Stream<Character> filterCharacter(String str){
List<Character> list = new ArrayList<>();
for (char c : str.toCharArray()) {
list.add(c);
}
return list.stream();
}
}
Stream-排序
package lambda;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class LambdaStream4 {
public static void main(String[] args) {
List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd");
list.stream()
.sorted(Comparator.reverseOrder())
.forEach(System.out::println);
List<Employee> employees = Data.getEList();
employees.stream()
.sorted((o1, o2) -> o1.getAge().equals(o2.getAge()) ?
o1.getName().compareTo(o2.getName()) :
o1.getAge().compareTo(o2.getAge()))
.forEach(System.out::println);
}
}
Stream-查找匹配
package lambda;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
public class LambdaStream5 {
public static void main(String[] args) {
List<Employee> employees = Data.getESList();
System.out.println(employees.stream().allMatch(e -> e.getStatus().equals(Status.BUSY)));
System.out.println(employees.stream().anyMatch(e -> e.getStatus().equals(Status.BUSY)));
System.out.println(employees.stream().noneMatch(e -> e.getStatus().equals(Status.BUSY)));
System.out.println(employees.stream()
.sorted(Comparator.comparingDouble(Employee::getSalary).reversed())
.findFirst().get());
System.out.println(employees.stream()
.filter(e -> e.getStatus().equals(Status.FREE))
.findAny().get());
System.out.println(employees.stream().count());
System.out.println(employees.stream()
.max(Comparator.comparingDouble(Employee::getSalary)).get());
System.out.println(employees.stream()
.map(Employee::getSalary).min(Double::compareTo).get());
}
}
Stream-规约
package lambda;
import java.util.*;
import java.util.stream.Collectors;
public class LambdaStream6 {
public static void main(String[] args) {
List<Employee> employees = Data.getESList();
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
System.out.println(list.stream().reduce(0, (x, y) -> x + y));
System.out.println(employees.stream().map(Employee::getSalary).reduce(Double::sum).get());
employees.stream().map(Employee::getName)
.collect(Collectors.toList()).forEach(System.out::println);
System.out.println("---------------------");
employees.stream().map(Employee::getName)
.collect(Collectors.toSet()).forEach(System.out::println);
System.out.println("---------------------");
employees.stream().map(Employee::getName)
.collect(Collectors.toCollection(TreeSet::new)).forEach(System.out::println);
System.out.println(employees.stream().collect(Collectors.counting()));
System.out.println(employees.stream().collect(
Collectors.averagingDouble(Employee::getSalary)));
System.out.println(employees.stream().collect(
Collectors.summingDouble(Employee::getSalary)));
System.out.println(employees.stream().collect(
Collectors.maxBy(Comparator.comparingDouble(Employee::getSalary))).get());
System.out.println(employees.stream()
.map(Employee::getSalary).collect(Collectors.minBy(Double::compareTo)).get());
System.out.println(employees.stream().collect(Collectors.groupingBy(Employee::getStatus)));
System.out.println(employees.stream().collect(
Collectors.groupingBy(Employee::getStatus, Collectors.groupingBy(e -> {
if (e.getAge() <= 35) {
return "青年";
} else if (e.getAge() <= 50) {
return "中年";
} else {
return "老年";
}
}))));
System.out.println(employees.stream().collect(Collectors.partitioningBy(e -> e.getSalary() >= 12500)));
DoubleSummaryStatistics dss = employees.stream()
.collect(Collectors.summarizingDouble(Employee::getSalary));
System.out.println(dss.getSum());
System.out.println(dss.getAverage());
System.out.println(dss.getMax());
System.out.println(employees.stream()
.map(Employee::getName).collect(Collectors.joining(",")));
}
}
集合中的lambda操作
public class lambdaMain {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
for (int i = 30; i > 0; i--) {
list.add(i % 9);
}
list.removeIf(integer -> integer < 3);
list.sort(Comparator.comparingInt(Integer::intValue));
System.out.println(list);
List<Integer> list1 = null;
System.out.println(Optional.ofNullable(list1)
.orElse(new ArrayList<>(Arrays.asList(1 ,2, 3)))
.stream().anyMatch(e -> e > 1));
Map<Integer, Integer> map = new HashMap<>();
list.forEach(e -> map.merge(e, 2, (oldValue, newValue) -> oldValue * newValue));
System.out.println(map);
Map<Integer, Integer> map1 = new HashMap<>();
list.forEach(e -> map1.compute(e, (k, v) -> v == null ? 1 : ++v));
System.out.println(map1);
map1.computeIfPresent(3, (k, v) -> 0);
System.out.println(map1);
map1.computeIfPresent(3, (k, v) -> null);
System.out.println(map1);
map1.computeIfAbsent(3, k -> 1000);
// 等价于
// map1.putIfAbsent(3, 1000);
System.out.println(map1);
}
}