日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

jdk8之lambda

發(fā)布時(shí)間:2023/12/4 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jdk8之lambda 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

Oracle號(hào)稱今年一定發(fā)布jdk8, 即使有bug, jdk8無(wú)疑最大的寵兒就是lambda表達(dá)式了,還是直接上代碼,看看lambda表達(dá)式怎么了。

  • 環(huán)境:

????? ? openjdk8, eclipse4.3.1(支持jdk8編譯)

  • 實(shí)例代碼:
// Demo1 public class RunnableTest {public static void main(String[] args) {Runnable runner = () -> System.out.println("I am lambda runner.");runner.run();} } // Demo2 import javax.swing.JButton;public class ListenerTest {public static void main(String[] args) {JButton btn = new JButton();btn.addActionListener(e -> System.out.println("Event Source is: " + e.getSource()));} } // Demo3 //Student.java public class Student {private String name;private float score;public Student(String name, float score) {this.name = name;this.score = score;}public String getName() {return name;}public void setName(String name) {this.name = name;}public float getScore() {return score;}public void setScore(float score) {this.score = score;}@Overridepublic String toString() {return "Student [name=" + name + ", score=" + score + "]";} }// ComparatorTest.java import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random;public class ComparatorTest {public static void main(String[] args) {List<Student> students = new ArrayList<>();Random r = new Random();for (int i=0; i<5; i++){students.add(new Student("stu"+i, r.nextFloat() * 100));}Collections.sort(students, (Student s1, Student s2) -> (int)(s1.getScore() - s2.getScore()));for (Student s: students){System.out.println(s);}} } 看了這3個(gè)例子,就會(huì)覺(jué)得lambda很偏向于函數(shù)式編程(如Lisp這種語(yǔ)言),這種語(yǔ)言很簡(jiǎn)潔,但是易讀性不是那么好,沒(méi)辦法,又想簡(jiǎn)潔又想易讀式不太容易的,以前java有匿名類,我們通常就實(shí)現(xiàn)這個(gè)匿名類里的一個(gè)接口,這叫Function Interface,現(xiàn)在我們就可以不用寫這個(gè)匿名類了,就直接實(shí)現(xiàn)接口就行了,就像上面的Demo一樣。

下面說(shuō)一下lambda在Collection上的工作:

  • Function接口:
public interface Function<T, R> {R apply(T t);... } Function接受一種類型T輸入,以另一類型R輸出, 看實(shí)例: import java.util.function.Function;public class Person {private String firstName;private String lastName;private int age;public Person(String firstName, String lastName){this.firstName = firstName;this.lastName = lastName;}public Person(String firstName, String lastName, int age) {this.firstName = firstName;this.lastName = lastName;this.age = age;}public String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName = firstName;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}/*** 這里就用Function實(shí)現(xiàn)可訂制的信息輸出* Function: 將輸入類型轉(zhuǎn)換為輸出類型,這里即將Person輸入,以String輸出*/public String printCustom(Function<Person, String> f){return f.apply(this);} } 測(cè)試用例: import java.util.function.Function;/*** Function 測(cè)試*/ public class FunctionTest {public static void main(String[] args) {Person person = new Person("Hello", "Function");// 用lambda表達(dá)式作為參數(shù)傳遞System.out.println(person.printCustom(p -> "FirstName : " + p.getFirstName()));// 用lambda表達(dá)式構(gòu)建Function對(duì)象Function<Person, String> westernStyle = p -> {return "LastName: " + p.getLastName() + ", FirstName: " + p.getFirstName();};Function<Person, String> eastStyle = p -> {return "FirstName: " + p.getFirstName() + ", LastName: " + p.getLastName();};System.out.println(person.printCustom(westernStyle));System.out.println(person.printCustom(eastStyle));} }

輸出結(jié)果:

  • 集合的迭代:
import java.util.ArrayList; import java.util.List;/*** 通過(guò)lambda迭代集合*/ public class LoopTest {public static void main(String[] args) {List<Person> ps = new ArrayList<>();for (int i=0; i<5; i++){ps.add(new Person("XX"+i, "OO"+i));}ps.forEach(p -> System.out.println(p.getFirstName()));//ps.forEach(Person::printEast);System.out.println("-------------------------");ps.forEach(p -> {System.out.println(p.printCustom(r->r.getLastName()+" " + r.getFirstName()));});} }
  • Predicate接口,它接受一種輸入類型,并通過(guò)test接口方法返回boolean值:
public interface Predicate<T> {boolean test(T t);... }

Predicate可以有效實(shí)現(xiàn)集合過(guò)濾操作:

測(cè)試用例:

/*** Predicate實(shí)現(xiàn)集合過(guò)濾*/ public class PredicateTest {public static void main(String[] args) {List<Person> ps = new ArrayList<>();Random r = new Random();for (int i=0; i<10; i++){ps.add(new Person("firstName"+i, "lastName"+i, r.nextInt(20) + 1));}Predicate<Person> children = p -> p.getAge() < 12;Predicate<Person> teenagers = p -> p.getAge() >= 12 && p.getAge() < 18;Predicate<Person> adults = p -> p.getAge() >= 18;for (Person p : ps){System.out.print(p.getFirstName() + "'s age is " + p.getAge());if (children.test(p)){System.out.println(", is a child.");} else if (teenagers.test(p)){System.out.println(", is a teenager.");} else if(adults.test(p)){System.out.println(", is an adult.");}}} }

輸出結(jié)果:

  • 2個(gè)綜合些的例子:
import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.function.Predicate; import java.util.stream.Collectors;public class CollectTest {public static void main(String[] args) {List<Person> ps = new ArrayList<>();Random r = new Random();for (int i=0; i<10;i++){ ps.add(new Person("firstname"+i, "lastname"+i, r.nextInt(30) + 1));}// 過(guò)濾條件>18歲Predicate<Person> adults = p -> p.getAge() > 18;// 通過(guò)collect獲取過(guò)濾后的集合List<Person> filteredPersons = ps.stream().filter(adults).collect(Collectors.toList());filteredPersons.forEach(p -> System.out.println(p.getFirstName() + " "+ p.getLastName()+"'s age: " + p.getAge()));} } import java.util.ArrayList; import java.util.List; import java.util.OptionalDouble; import java.util.OptionalInt; import java.util.Random; import java.util.function.Predicate;/*** 通過(guò)map來(lái)實(shí)現(xiàn)求最大值,平均值*/ public class MapTest {public static void main(String[] args) {List<Person> ps = new ArrayList<>();Random r = new Random();for (int i=0; i<10;i++){ ps.add(new Person("firstname"+i, "lastname"+i, r.nextInt(30) + 1));}// 過(guò)濾條件>18歲Predicate<Person> adults = p -> p.getAge() > 18;//最大年齡OptionalInt maxAge = ps.parallelStream().filter(adults).mapToInt(p -> p.getAge()).max();System.out.println("最大年齡:" + maxAge.getAsInt());// 求18歲以上的平均值OptionalDouble average = ps.parallelStream().filter(adults).mapToDouble(p -> p.getAge()).average();System.out.println("平均年齡:" + average.getAsDouble());} }
  • 收工。

轉(zhuǎn)載于:https://my.oschina.net/indestiny/blog/196347

總結(jié)

以上是生活随笔為你收集整理的jdk8之lambda的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。