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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

lambda ::表达式_Lambda表达式和流API:基本示例

發布時間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 lambda ::表达式_Lambda表达式和流API:基本示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

lambda ::表達式

這篇博客文章包含基本Lambda表達式和Stream API示例的列表,我在2014年6月在Java用戶組Politechnica Gedanensis (格但斯克技術大學)和Goyello的實時編碼演示中使用了這些示例。

Lambda表達式

句法

最常見的示例:

Runnable runnable = () -> System.out.println("Hello!"); Thread t = new Thread(runnable); t.start(); t.join();

可以這樣寫:

Thread t = new Thread(() -> System.out.println("Hello!")); t.start(); t.join();

那參數呢?

Comparator<String> stringComparator = (s1, s2) -> s1.compareTo(s2);

并擴展為完整表達:

Comparator<String> stringComparator = (String s1, String s2) -> {System.out.println("Comparing...");return s1.compareTo(s2); };

功能界面

Lambda表達式使您可以更緊湊地表達單方法類的實例。 單方法類稱為函數接口, 可以使用@FunctionalInterface進行注釋:

@FunctionalInterface public interface MyFunctionalInterface<T> {boolean test(T t); } // Usage MyFunctionalInterface<String> l = s -> s.startsWith("A");

方法參考

方法引用是緊湊的,易于閱讀的lambda表達式,用于具有名稱的方法。 讓我們看一個簡單的例子:

public class Sample {public static void main(String[] args) {Runnable runnable = Sample::run;}private static void run() {System.out.println("Hello!");} }

另一個例子:

public static void main(String[] args) {Sample sample = new Sample();Comparator<String> stringLengthComparator = sample::compareLength; }private int compareLength(String s1, String s2) {return s1.length() - s2.length(); }

流API –基礎

流是支持順序和并行批量操作的一系列元素。

遍歷列表

List<String> list = Arrays.asList("one", "two", "three", "four", "five", "six");list.stream().forEach(s -> System.out.println(s));

篩選

Java 8在接口中引入了默認方法。 它們在Stream API中非常方便:

Predicate<String> lowerThanOrEqualToFour = s -> s.length() <= 4; Predicate<String> greaterThanOrEqualToThree = s -> s.length() >= 3;list.stream().filter(lowerThanOrEqualToFour.and(greaterThanOrEqualToThree)).forEach(s -> System.out.println(s));

排序

Predicate<String> lowerThanOrEqualToFour = s -> s.length() <= 4; Predicate<String> greaterThanOrEqualToThree = s -> s.length() >= 3; Comparator<String> byLastLetter = (s1, s2) -> s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1); Comparator<String> byLength = (s1, s2) -> s1.length() - s2.length();list.stream().filter(lowerThanOrEqualToFour.and(greaterThanOrEqualToThree)).sorted(byLastLetter.thenComparing(byLength)).forEach(s -> System.out.println(s));

另外,在上述例子的默認方法and的java.util.function.Predicate被使用。 默認(和靜態)方法是Java 8中接口的新增方法。

限制

Predicate<String> lowerThanOrEqualToFour = s -> s.length() <= 4; Predicate<String> greaterThanOrEqualToThree = s -> s.length() >= 3; Comparator<String> byLastLetter = (s1, s2) -> s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1); Comparator<String> byLength = (s1, s2) -> s1.length() - s2.length();list.stream().filter(lowerThanOrEqualToFour.and(greaterThanOrEqualToThree)).sorted(byLastLetter.thenComparing(byLength)).limit(4).forEach(s -> System.out.println(s));

收集到清單

Predicate<String> lowerThanOrEqualToFour = s -> s.length() <= 4; Predicate<String> greaterThanOrEqualToThree = s -> s.length() >= 3; Comparator<String> byLastLetter = (s1, s2) -> s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1); Comparator<String> byLength = (s1, s2) -> s1.length() - s2.length();List<String> result = list.stream().filter(lowerThanOrEqualToFour.and(greaterThanOrEqualToThree)).sorted(byLastLetter.thenComparing(byLength)).limit(4).collect(Collectors.toList());

并行處理

我使用了一個非常常見的示例來遍歷文件列表:

public static void main(String[] args) {File[] files = new File("c:/windows").listFiles();Stream.of(files).parallel().forEach(Sample::process); }private static void process(File file) {try {Thread.sleep(1000);} catch (InterruptedException e) {}System.out.println("Processing -> " + file); }

請注意,在顯示示例時,我解釋了并行處理流的一些已知缺點。

流API –更多示例

制圖

遍歷目錄中的文件并返回FileSize對象:

class FileSize {private final File file;private final Long size;FileSize(File file, Long size) {this.file = file;this.size = size;}File getFile() {return file;}Long getSize() {return size;}String getName() {return getFile().getName();}String getFirstLetter() {return getName().substring(0, 1);}@Overridepublic String toString() {return Objects.toStringHelper(this).add("file", file).add("size", size).toString();} }

映射的最終代碼:

File[] files = new File("c:/windows").listFiles(); List<FileSize> result = Stream.of(files).map(FileSize::new).collect(Collectors.toList());

分組

按文件名的首字母對FileSize對象進行分組:

Map<String, List<FileSize>> result = Stream.of(files).map(FileSize::new).collect(Collectors.groupingBy(FileSize::getFirstLetter));

減少

獲取目錄中最大/最小的文件:

Optional<FileSize> filesize = Stream.of(files).map(FileSize::new).reduce((fs1, fs2) -> fs1.getSize() > fs2.getSize() ? fs1 : fs2);

如果您不需要FileSize對象,而只需要一個數字:

OptionalLong max = Stream.of(files).map(FileSize::new).mapToLong(fs -> fs.getSize()).max();

翻譯自: https://www.javacodegeeks.com/2014/06/lambda-expressions-and-stream-api-basic-examples.html

lambda ::表達式

總結

以上是生活随笔為你收集整理的lambda ::表达式_Lambda表达式和流API:基本示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。