List<Person> people = List.of( new Person("John", MALE), new Person("Maria", FEMALE), new Person("Aisha", FEMALE), new Person("Alex", MALE), new Person("Alice", FEMALE) );
「Person」的定义如下
1 2 3 4 5
private record Person(String name, Gender gender){}
enumGender{ MALE, FEMALE }
如果我们想在列表中找到 FEMALE,我们可以使用这样的命令式方法
1 2 3 4 5 6 7 8 9 10 11
List<Person> females = new ArrayList<>();
for (Person person : people) { if (FEMALE.equals(person.gender)) { females.add(person); } }
for (Person female : females) { System.out.println(female); }
但它在声明式方法中更简洁
1 2 3 4 5
Predicate<Person> personPredicate = person -> FEMALE.equals(person.gender); var females2 = people.stream().filter(personPredicate) .collect(Collectors.toList()); // .forEach(System.out::println); females2.forEach(System.out::println);
publicclassMain{ publicstaticvoidmain(String[] args){ List<Person> people = List.of( new Person("John", MALE), new Person("Maria", FEMALE), new Person("Aisha", FEMALE), new Person("Alex", MALE), new Person("Alice", FEMALE) );
System.out.println("Imperative approach"); // Imperative approach List<Person> females = new ArrayList<>(); for (Person person : people) { if (FEMALE.equals(person.gender)) { females.add(person); } } for (Person female : females) { System.out.println(female); }
// Declarative approach System.out.println("Declarative approach"); Predicate<Person> personPredicate = person -> FEMALE.equals(person.gender); var females2 = people.stream().filter(personPredicate) .collect(Collectors.toList()); // .forEach(System.out::println); females2.forEach(System.out::println); }
static Function<Integer, Integer> incrementByOneFunction = number -> number + 1; static Function<Integer, Integer> multiplyBy10Function = number -> number * 10; ---usage var increment2 = incrementByOneFunction.apply(1); var multiply = multiplyBy10Function.apply(increment2);
酷,如果你看不懂,那么我们之前用命令式编程是这么写的
1 2 3 4 5
staticintincrementByOne(int number){ return number + 1; } ---usage var increment = incrementByOne(1);
更进一步,我们可以结合两个 Function
1 2 3
var addBy1AndThenMultiplyBy10 = incrementByOneFunction.andThen(multiplyBy10Function); ---usage var ans = addBy1AndThenMultiplyBy10.apply(4);
publicclass_Function{ publicstaticvoidmain(String[] args){ // Function takes 1 argument and produce 1 result var increment = incrementByOne(1); System.out.println(increment);
var increment2 = incrementByOneFunction.apply(1); System.out.println(increment2);
var multiply = multiplyBy10Function.apply(increment2); System.out.println(multiply);
var addBy1AndThenMultiplyBy10 = incrementByOneFunction.andThen(multiplyBy10Function); var ans = addBy1AndThenMultiplyBy10.apply(4); System.out.println(ans);
// BiFunction takes 2 argument and produce 1 result System.out.println(incrementByOneAndMultiply(4, 100)); System.out.println(incrementByOneAndMultiplyBiFunction.apply(4, 100)); }
static Function<Integer, Integer> incrementByOneFunction = number -> number + 1;
System.out.println( "Is phone number valid and contains number 3 = " + isPhoneNumberValidPredicate.and(containsNumber3).test("07009877300") );
var isPhoneNumberValidAndContainsNumber3 = isPhoneNumberValidPredicate.or(containsNumber3); System.out.println( "Is phone number valid or contains number 3 = " + isPhoneNumberValidAndContainsNumber3.test("07000000000") );
还记得我们在概要中写的代码 stream().filter() 吗?
1 2
var females2 = people.stream().filter(person -> FEMALE.equals(person.gender)) .collect(Collectors.toList());
filter 接收的参数就是 Predicate ,在 idea 中使用快捷键 「Ctrl + Alt + V」将它的参数提取成变量,我们就会看到 Predicate
1 2 3
Predicate<Person> personPredicate = person -> FEMALE.equals(person.gender); var females2 = people.stream().filter(personPredicate) .collect(Collectors.toList());
System.out.println( "Is phone number valid and contains number 3 = " + isPhoneNumberValidPredicate.and(containsNumber3).test("07009877300") );
var isPhoneNumberValidAndContainsNumber3 = isPhoneNumberValidPredicate.or(containsNumber3); System.out.println( "Is phone number valid or contains number 3 = " + isPhoneNumberValidAndContainsNumber3.test("07000000000") );
private record Person(String name, Gender gender){ }
enumGender{ MALE, FEMALE, PREFER_NOT_TO_SAY }
List<Person> people = List.of( new Person("John", MALE), new Person("Maria", FEMALE), new Person("Aisha", FEMALE), new Person("Alex", MALE), new Person("Alice", FEMALE), new Person("Bob", PREFER_NOT_TO_SAY) );
// Using combinator pattern var result = isEmailValid() .and(isPhoneNumberValid()) .and(isAnAdult()) .apply(customer); System.out.println(result); if (result != ValidationResult.SUCCESS) { thrownew IllegalStateException(result.name()); }
// Lazy lode var result2 = isEmailValid() .and(isPhoneNumberValid()) .and(isAnAdult()) .and(printSomething()); System.out.println("not load before apply()"); result2.apply(customer);
/* Callback function in js: function hello(firstName, lastName,callback) { console.log(firstName); if (lastName) { console.log(lastName); } else { callback(); } }