วันศุกร์ที่ 6 พฤษภาคม พ.ศ. 2559

Lambdas & Streams for Java EE 8


คุณลักษณะของ Lambda Expressions

-Lambda expression = anonymous function
-anonymous function จะคิดว่ามันเหมือน Method แต่ไม่เกี่ยวข้องกับ Class
-สามารถนำมาใช้ในทุกที่ที่คุณจะใช้ใน anonymous inner class คือ Single abstract method type
-Syntax จะอยู่ในรูปแบบ ([optional-parameters]) -> body

ตัวอย่าง Lambda 

SomeList<Student> students = ...
double highestScore =
  students.stream().
           filter(Student s -> s.getGradYear() == 2011).
           map(Student s -> s.getScore()).
           max();

การอ้าง Method

ขั้นตอนที่ 1 เราเขียน Java 7 โดยปกติ

FileFilter x = new FileFilter() {
  public boolean accept(File f) {
    return f.canRead();
  }
};

ขั้นตอนที่ 2 เมื่อเราใช้ Lambda Expressions ใน Java 8 เราจะเหลือแค่นี้เอง...

FileFilter x = (File f) -> f.canRead();
FileFilter x = File::canRead;

การใช้ Stream Class : java.util.stream

Stream<T> คือ การลำดับขององค์ประกอบที่สนับสนุนการดำเนินงานต่อเนื่อง (sequential) และแบบขนาน (parallel) ประกอบด้วย
-Collection.stream()
-Collection.parallelStream()

Multiple operations available

-collect, filter, count, skip, limit, sorted
-map (and map to types เช่น mapToInt)

flatMap คือ การ maps แต่ละองค์ประกอบในการสตรีมกับหลาย ๆ องค์ประกอบ
ตัวอย่างเช่น flatMap(line -> Stream.of(line.split(REGEXP));

ตัวอย่างการใช้ Stream Class

List<String> names = Arrays.asList(“Bob”, “Alice”, “Charlie”);
System.out.println(names.stream().filter(e -> e.getLength() > 4).findFirst().get());

Useful Stream Methods

-collect (terminal)
-filter (intermediate)
-count (terminal)
-skip, limit (intermediate)
-max (terminal)
-getAsInt (terminal)

ตัวอย่าง Utils ที่มีใช้ใน java.util.function Package

-Predicate<T>
ตรวจสอบว่ามีการป้อนข้อมูลจากประเภท T ตรงกับเกณฑ์ บางอย่าง
-Consumer<T>
ยอมรับการป้อนข้อมูลเดียว argumentof ประเภท T และ return no result
-Function<T, R>
ประยุกต์ฟังก์ชั่นการป้อนข้อมูลประเภท T โดยการสร้างผลมาจาก R

Iterable Interface

1 method : forEach()
wordList.forEach(s -> System.out.println(s));
wordList.forEach(System.out::println);

การสร้าง Files และ Lines of Text

-BufferedReader มีการ new method
Stream<String> lines()

Reference : เอกสาร Lambdas & Streams Laboratory โดย Stuart Marks, Simon Ritter, Angela Caicedo จาก Oracle Corp. ในงาน JavaOne

ไม่มีความคิดเห็น:

แสดงความคิดเห็น