lambda ::表达式_Lambda表达式和流API:基本示例
lambda ::表達式
這篇博客文章包含基本Lambda表達式和Stream API示例的列表,我在2014年6月在Java用戶組Politechnica Gedanensis (格但斯克技術大學)和Goyello的實時編碼演示中使用了這些示例。
Lambda表達式
句法
最常見的示例:
可以這樣寫:
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:基本示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阴历阳历多少年重合一次 阴历阳历好多年重
- 下一篇: 高通上海被曝大规模裁员 员工或流入国内芯