public class Test {
public static void main(String[] args) throws InterruptedException {
String name = "";
String name1 = "12345";
System.out.println(validInput(name, inputStr -> inputStr.isEmpty() ? "名字不能爲空":inputStr));
System.out.println(validInput(name1, inputStr -> inputStr.length() > 3 ? "名字過長":inputStr));
}
public static String validInput(String name,Function<String,String> function) {
return function.apply(name);
}
}
// 統計年齡在25-35歲的男女人數、比例
public void boysAndGirls(List<Person> persons) {
Map<Integer, Integer> result = persons.parallelStream().filter(p -> p.getAge()>=25 && p.getAge()<=35).
collect(
Collectors.groupingBy(p->p.getSex(), Collectors.summingInt(p->1))
);
System.out.print("boysAndGirls result is " + result);
System.out.println(", ratio (male : female) is " + (float)result.get(Person.MALE)/result.get(Person.FEMALE));
}
// 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)
- 參數類型省略–絕大多數情況,編譯器都可以從上下文環境中推斷出lambda表達式的參數類型。例如上面的第二條 x 和第三條 (x,y) 都沒聲明類型。
- 當lambda表達式的參數個數只有一個,可以省略小括號。 如上面 第二條的 x
- 當lambda表達式只包含一條語句時,可以省略大括號、return和語句結尾的分號。如上面的返回都沒有 return 這東西。
- lambda 表達式 可以訪問外部變量(外部變量不可變)。
public class Test {
public static void main(String[] args) throws InterruptedException {
String name = "";
String name1 = "12345";
System.out.println(validInput(name, inputStr -> inputStr.isEmpty() ? "名字不能爲空":inputStr));
System.out.println(validInput(name1, inputStr -> inputStr.length() > 3 ? "名字過長":inputStr));
}
public static String validInput(String name,Function<String,String> function) {
return function.apply(name);
}
}
public class Test {
public static void main(String[] args) throws InterruptedException {
String name = "";
String name1 = "12345";
validInput(name, inputStr ->
System.out.println(inputStr.isEmpty() ? "名字不能爲空":"名字正常"));
validInput(name1, inputStr ->
System.out.println(inputStr.isEmpty() ? "名字不能爲空":"名字正常"));
}
public static void validInput(String name,Consumer<String> function) {
function.accept(name);
}
}
public class Test {
public static void main(String[] args) throws InterruptedException {
String name = "";
String name1 = "12";
String name2 = "12345";
System.out.println(validInput(name,inputStr -> !inputStr.isEmpty() && inputStr.length() <= 3 ));
System.out.println(validInput(name1,inputStr -> !inputStr.isEmpty() && inputStr.length() <= 3 ));
System.out.println(validInput(name2,inputStr -> !inputStr.isEmpty() && inputStr.length() <= 3 ));
}
public static boolean validInput(String name,Predicate<String> function) {
return function.test(name);
}
}
四.lambda 配合 集合的使用
//給出一個String類型的數組,求其中所有不重複素數的和
public void distinctPrimarySum(String... numbers) {
List<String> l = Arrays.asList(numbers);
int sum = l.stream()
.map(e -> new Integer(e))
.filter(e -> Primes.isPrime(e))
.distinct()
.reduce(0, (x,y) -> x+y); // equivalent to .sum()
System.out.println("distinctPrimarySum result is: " + sum);
- 引入lambda:代碼更簡單,配合其他使用效率更高。
- lambda語法:基本組成由 參數列表,箭頭,表達式組成。如果參數列表和表達式簡單,還可以把括號什麼的進一步省略。
- Lambda的使用:一般配合 Function,Consumer,Predicate或者自定義的函數式接口使用,使得代碼更加方便;同時也配合集合使用,提升效率,提高閱讀性。