<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Java 流歸約 原文:http://zetcode.com/java/streamreduce/ Java 流歸約教程展示了如何對 Java8 流執行縮減操作。 ## Java 流 Java 流是來自源的支持聚合操作的一系列元素。 流不存儲元素。 元素是按需計算的。 元素是從數據源(如集合,數組或 I/O 資源)中消耗的。 ## Java 流歸約 歸約是將流聚合為類或原始類型的終端操作。 Java8 流 API 包含一組預定義的歸約操作,例如`average()`,`sum()`,`min()`,`max()`和`count()`,它們通過組合流的元素來返回一個值。 ## Java 流`reduce`方法 `Stream.reduce()`是用于生成自定義歸約運算的通用方法。 ```java Optional<T> reduce(BinaryOperator<T> accumulator) ``` 此方法使用關聯累加函數對該流的元素進行歸約。 它返回一個`Optional`描述歸約的值(如果有)。 ```java T reduce(T identity, BinaryOperator<T> accumulator) ``` 此方法采用兩個參數:標識和累加器。 如果流中沒有元素,則身份元素既是`reduce`的初始值,也是默認結果。 累加器函數具有兩個參數:約簡的部分結果和流的下一個元素。 它返回一個新的部分結果。 `Stream.reduce()`方法返回歸約的結果。 ## Java 流內置歸約 以下示例使用了兩個預定義的歸約操作。 `JavaReduceEx.java` ```java package com.zetcode; import java.util.Arrays; public class JavaReduceEx { public static void main(String[] args) { int vals[] = { 2, 4, 6, 8, 10, 12, 14, 16 }; int sum = Arrays.stream(vals).sum(); System.out.printf("The sum of values: %d%n", sum); long n = Arrays.stream(vals).count(); System.out.printf("The number of values: %d%n", n); } } ``` 我們有一個整數數組。 我們使用`Arrays.stream()`從數組創建一個流,并執行兩個歸約:`sum()`和`count()`。 ```java The sum of values: 72 The number of values: 8 ``` 這是輸出。 ## Java `reduce`和`Optional` 具有一個參數的`reduce()`方法返回`Optional`,這是用于`null`安全的 Java 類。 `Car.java` ```java package com.zetcode; public class Car { private final String name; private final int price; public Car(String name, int price) { this.name = name; this.price = price; } public int getPrice() { return price; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("Car{name=").append(name).append(", price=") .append(price).append("}"); return builder.toString(); } } ``` 這是`Car`類。 `JavaReduceEx2.java` ```java package com.zetcode; import java.util.Arrays; import java.util.List; import java.util.Optional; public class JavaReduceEx2 { public static void main(String[] args) { List<Car> persons = Arrays.asList(new Car("Skoda", 18544), new Car("Volvo", 22344), new Car("Fiat", 23650), new Car("Renault", 19700)); Optional<Car> car = persons.stream().reduce((c1, c2) -> c1.getPrice() > c2.getPrice() ? c1 : c2); car.ifPresent(System.out::println); } } ``` 該示例創建一個汽車對象列表。 我們計算出最昂貴的汽車。 ```java Optional<Car> car = persons.stream().reduce((c1, c2) -> c1.getPrice() > c2.getPrice() ? c1 : c2); ``` 從列表中,我們創建一個流; `reduce()`方法的累加器會比較汽車的價格并返回價格較高的汽車。 ```java car.ifPresent(System.out::println); ``` 如果返回的歸約值不為 null,則將其打印到控制臺。 ```java Car{name=Fiat, price=23650} ``` 這是輸出。 下一個示例添加了其他用例。 `MyUtil.java` ```java package com.zetcode; public class MyUtil { public static int add2Ints(int num1, int num2) { return num1 + num2; } } ``` 這是`MyUtil`類,具有一種將兩個整數相加的方法。 `JavaReduceEx3.java` ```java package com.zetcode; import java.util.stream.IntStream; public class JavaReduceEx3 { public static void main(String[] args) { IntStream.range(1, 10).reduce((x, y) -> x + y) .ifPresent(s -> System.out.println(s)); IntStream.range(1, 10).reduce(Integer::sum) .ifPresent(s -> System.out.println(s)); IntStream.range(1, 10).reduce(MyUtil::add2Ints) .ifPresent(s -> System.out.println(s)); } } ``` 我們創建三個不同的累加器函數來計算`1..10`值的總和。 ```java IntStream.range(1, 10).reduce((x, y) -> x + y).ifPresent(s -> System.out.println(s)); ``` 在第一種情況下,我們使用 lambda 表達式進行加法。 ```java IntStream.range(1, 10).reduce(Integer::sum).ifPresent(s -> System.out.println(s)); ``` 第二種情況使用內置的`Integer::sum`方法。 ```java IntStream.range(1, 10).reduce(MyUtil::add2Ints).ifPresent(s -> System.out.println(s)); ``` 最后,我們有一個自定義的添加方法。 ## Java 歸約標識 正如我們已經提到的,如果流中沒有元素,則標識既是還原的初始值,又是默認結果。 `User.java` ```java package com.zetcode; import java.time.LocalDate; import java.time.chrono.IsoChronology; public class User { private String name; private LocalDate dateOfBirth; public User(String name, LocalDate dateOfBirth) { this.name = name; this.dateOfBirth = dateOfBirth; } public String getName() { return name; } public void setName(String name) { this.name = name; } public LocalDate getDateOfBirth() { return dateOfBirth; } public void setDateOfBirth(LocalDate dateOfBirth) { this.dateOfBirth = dateOfBirth; } public int getAge() { return dateOfBirth.until(IsoChronology.INSTANCE.dateNow()) .getYears(); } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("User{name=").append(name).append(", dateOfBirth=") .append(dateOfBirth).append("}"); return builder.toString(); } } ``` 這是`User`類。 除了常用的屬性,獲取器和設置器之外,我們還有`getAge()`方法,該方法使用 Java8 日期 API 返回用戶的年齡。 `JavaReduceEx4.java` ```java package com.zetcode; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; public class JavaReduceEx4 { public static void main(String[] args) { List<User> users = new ArrayList<>(); users.add(new User("Frank", LocalDate.of(1979, 11, 23))); users.add(new User("Peter", LocalDate.of(1985, 1, 18))); users.add(new User("Lucy", LocalDate.of(2002, 5, 14))); users.add(new User("Albert", LocalDate.of(1996, 8, 30))); users.add(new User("Frank", LocalDate.of(1967, 10, 6))); int maxAge = users.stream().mapToInt(User::getAge) .reduce(0, (a1, a2) -> a1 > a2 ? a1 : a2); System.out.printf("The oldest user's age: %s%n", maxAge); } } ``` 在示例中,我們創建了一個用戶列表。 該示例計算最老用戶的年齡。 ```java int maxAge = users.stream().mapToInt(User::getAge) .reduce(0, (a1, a2) -> a1 > a2 ? a1 : a2); ``` 從列表中,我們創建一個 Java8 流。 使用`mapToInt()`方法將流映射到`IntStream`。 最后,`reduce()`方法提供一個標識值(0)和一個累加器; 累加器將比較年齡值并返回較大的值。 在本教程中,我們已經使用 Java 流歸約操作。 您可能也對相關教程感興趣: [Java 流](/lang/java/streams), [Java 流映射](/java/streammap/), [Java 流過濾器](/java/streamfilter)和 [Java8 `forEach`教程](/articles/java8foreach/)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看