2015-07-22 9 views
8

Co szukam jest sposobem konwersji kolekcji jednego rodzaju do zbierania innego rodzaju wykorzystaniem strumieni i mapę bez predefiniowanego funkcja/funkcjonalny interfejs, który przekształca Object sprzeciwić B. Java 6 Przykład:Konwersja kolekcji do innego typu kolekcji bez predefiniowanej metody w Javie 8

for (ObjectA objA : collectionA) { 
    ObjectB objB = new ObjectB(); 
    objB.setId(objA.getId()); 
    collectionB.add(objB); 
} 

szukam czegoś w linii:

List<ObjectB> collectionB = collectionA.stream().map(objA -> { 
    ObjectB objB = new ObjectB(); 
    objB.setId(objA.getId()); 
    return objB; 
}); 

które z CO Urse nie działa, ale masz sens tego, co próbuję zrobić.

Odpowiedz

9

Po zrobić mapowanie, trzeba zbierać odwzorowanych obiektów:

List<ObjectB> collectionB = collectionA.stream().map(objA -> { 
    ObjectB objB = new ObjectB(); 
    objB.setId(objA.getId()); 
    return objB; 
}).collect(Collectors.toList()); 
3

Kod próbka jest po prostu brakuje terminala collect operację, aby zebrać elementy Stream<ObjectB> który został zwrócony z operacji map w List<ObjectB>:

List<ObjectB> collectionB = collectionA.stream().map(objA -> { 
    ObjectB objB = new ObjectB(); 
    objB.setId(objA.getId()); 
    return objB; 
}).collect(Collectors.toList()); 

Jeśli dodać do swojej klasy ObjectB konstruktor przyjmuje parametr typu ObjectA i ustawia identyfikator, można uprościć kod:

tj ObjectB dodaniu tego konstruktora:

public ObjectB (ObjectA objA) 
{ 
    setId(objA.getId()); 
} 

a kod staje:

List<ObjectB> collectionB = collectionA.stream() 
             .map(ObjectB::new) 
             .collect(Collectors.toList()); 
0

Dla obserwuje

incompatible types: no instance(s) of type variable(s) R 
exist so that java.util.stream.Stream<R> conforms to 
java.util.List<org.class.Name> 

po wykonaniu konwersji map, oznaczało to "przekazujesz dane wyjściowe strumienia do metody, która nie bierze tego jako parametru" (sama konwersja mapy strumienia faktycznie działa) lub przypisujesz ją do zmienna innego rodzaju.

0

Można go bezpośrednio przekonwertować, przekazując odwołanie do pierwszej kolekcji do innego konstruktora parametryzacji kolekcji.

przykład:

 List<String> ff = new ArrayList<String>(); 
    ff.add("AA"); 
    ff.add("AA"); 
    ff.add("cc"); 
    ff.add("dd"); 
    ff.add("ee"); 

    System.out.println(ff.size()); 

    HashSet<String> gg = new HashSet<>(ff); 

    System.out.println(gg.size()); 
    for (String s: gg) { 
      System.out.println("output= " + s); 
    } 

Wielkość 5 zostaje zmniejszony do 4, w innej kolekcji jako listy mogą zawiera duplikaty gdy zestaw nie.

wyjściowa:

wyjściowy = AA

wyjściowy = cc

wyjściowy = dd

wyjściowy = ee

Powiązane problemy