2016-07-31 131 views
8

我想了解流和遇到問題: 我想獲得列表的最小值並將其分配給一個int變量。 對於我做了以下內容:Java 8流「ifPresent」

List<Integer> list = new ArrayList<>(); 
    list.add(1); 
    list.add(2); 
    list.add(3); 
    int smallest = list.stream().min(Integer::compareTo).get(); 
    System.out.println(smallest); 

這工作得很好,我得到1結果。 問題是在檢查.isPresent之前,IDE會提示Optional.get。 要解決,我使用的略有不同ifPresent方法和嘗試以下操作:

int smallest = list.stream().min(Integer::compareTo).ifPresent(integer -> integer); 

不幸的是,因爲我得到警告,這並不工作:Bad return type in Lambda, Integer cannot be converted to void. 我的問題總算是:我怎樣才能分鐘值賦給int smallest變量與檢查ifPresent?

+1

你首先必須明白爲什麼你得到一個可選的,而不是一個整數:因爲該流可能是空的,因此可能沒有任何最小值。然後,如果流爲空,則需要決定想要得到的結果。然後,一旦你知道你想要什麼,你就可以通過查看Optional的文檔來選擇正確的方式來獲得結果。 –

+1

'ifPresent'接受'Consumer'作爲它的參數,它消耗輸入值並不返回任何內容。 –

回答

6

Stream#min回報Optional因爲一般流可以是空的,所以不可能有極小值。

Optional<Integer> minimal = list.stream().min(Integer::compareTo); 

從可選獲得價值,你需要有一些備用值

Integer absent = Integer.MIN_VALUE; 

最簡單的辦法是使用orElse

Integer smallest = minimal.orElse(absent); 

久一點會是isPresent

Integer smallest = minimal.isPresent() ? minimal.get() : absent; 
+0

所以orElse方法返回一個整數類型而不是像.min方法那樣的可選項? –

+1

是的,在這個例子中它將是'Integer'。一般而言'可選'可以包含任何類型'T'的值,所以'orElse'返回那個類型'T' –

+0

非常感謝! –

7

以下是我會怎麼做它:結果

package lambdas; 

import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by Michael 
* Creation date 7/31/2016. 
* @link https://stackoverflow.com/questions/38688119/java-8-streams-ifpresent 
*/ 
public class MinimumExample { 

    public static void main(String[] args) { 
     List<Integer> list = new ArrayList<>(); 
     int smallest = list.stream().min(Integer::compareTo).orElse(Integer.MIN_VALUE); 
     System.out.println(smallest); 
    } 
} 
+0

如果'.min'方法返回一個Optional,那麼'.orElse'方法需要返回一個Integer。 '.orElse'然後調用'.get'方法嗎? –

+0

此代碼可以正常運行。它受到你接受的答覆的支持。你的問題是什麼? – duffymo

1

ifPresent方法以Consumer<? super T>作爲參數。簡單地說,它應該是一個沒有return聲明的行動。您可以打印該值,如果它存在,就像

[...].ifPresent(System.out::print); 

但這不是IDEA所說的。我想,你只需要保存Option<Integer>實例,然後通過isPresent檢查:

Optional<Integer> o = list.stream().min(Integer::compareTo); 
if (o.isPresent()) { 
    smallest = o.get(); 
} 

當然,還有更方便的方式與orElse

smallest = o.orElse(Integer.MIN_VALUE); 

或三元運算符:

smallest = o.isPresent() ? o.get() : Integer.MIN_VALUE;