2016-07-31 17 views
8

Akımlar hakkında bilgi edinmek ve bir sorunla karşılaşmaya çalışıyorum: Bir listenin minimum değerini almak ve bir int değişkenine atamak istiyorum.Java 8 akışları "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); 

Bu iyi çalışıyor ve ben bir sonucu olarak 1 olsun: Bunun için aşağıdaki yaptım. Sorun, IDE'nin'un .isPresent denetlemeden önce çağrıldığını bildirmesidir. i biraz farklı ifPresent yöntemi kullanmış ve çalıştı gidermek için aşağıdakileri yapın:

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

Ben uyarıyı almak için maalesef bu işe yaramazsa: Bad return type in Lambda, Integer cannot be converted to void. sorum nihayet: Ben dk değer atayabilirsiniz nasıl ifPresent'i kontrol eden int smallest değişkeni? İşte

+1

Öncelikli olarak neden bir Tamsayı aldığınızı anlamanız gerekir: akış boş olabilir ve bu nedenle herhangi bir minimum değer olmayabilir. Ardından, akış boşsa, sonuç olarak ne elde etmek istediğinize karar vermeniz gerekir. Ardından, ne istediğinizi öğrendikten sonra, Optional'ın belgelerine bakarak bu sonucu elde etmek için doğru yolu seçebileceksiniz. –

+1

'ifPresent', giriş değerini tüketen ve hiçbir şey döndürmeyen argümanı olarak bir" Tüketici "alır. –

cevap

6

Stream#min dönüş Optional hiçbir asgari değer olabilir böylece genel akışında boş olabilir çünkü.

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

bazı geri dönüş değerini

Integer absent = Integer.MIN_VALUE; 

olması gerekir İsteğe değeri elde etmek orElse

Biraz daha uzun

Integer smallest = minimal.orElse(absent); 
olacağını en kolay kullanmak olacaktır isPresent

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

böylece orElse yöntemi bir Tamsayı Türü döndürür ve .min yöntemi gibi İsteğe bağlı değil? –

+1

evet, bu örnekte "Tamsayı" olacaktır. Genel olarak 'İsteğe bağlı ',' T' türünde herhangi bir değer içerebilir, bu nedenle 'T' –

+0

türünü döndürür. –

7

yapardım nasıl: sonucun

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' yöntemi bir İsteğe bağlı döndürürse,' .orElse' yönteminin bir Tamsayı döndürmesi gerekir. '' '' '' '' '' '' '' Yöntemini çağırır mı? –

+0

Bu kod çalışıyor ve çalışıyor.Kabul ettiğin cevapla işe yarıyordu. Sorun nedir? – duffymo

1

ifPresent yöntemi, Consumer<? super T> yöntemini parametre olarak alır. Basitçe söylemek gerekirse, return bildirimi olmadan bir eylem olmalıdır. Varsa değeri yazdırabilirsiniz, Ancak, IDEA'nın söylediği gibi değil.

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

, daha rahat yollar orElse ile vardır: Ben sadece isPresent tarafından kontrol sonra Option<Integer> örneğini kaydetmek ve gerekir düşünüyorum

smallest = o.orElse(Integer.MIN_VALUE); 

veya üçlü operatör ile

:

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