Strumienie, a hashmapa

0

Witam,

otóż mam pewien problem dotyczący strumieni, a mianowicie: posiadam HashMapę: java HashMap<Integer, BigDecimal>. Następnie w strumieniach chcę stworzyć coś takiego: wziąć mapę, przefiltrować tą mapę po wartościach funkcją boolean, a potem dla tej nowej HashMapy (po filtrze) w foreachu wyświetlić klucze tej mapy + tekst.

Tutaj funkcja boolean, którą chcę użyć do filtrowania:

    public boolean isInteger(BigDecimal number) {
            return number.setScale(0, RoundingMode.HALF_UP).compareTo(number) == 0;
    }

a tutaj mój strumień, którym próbuję:

    HashMap<Integer, BigDecimal> mapAfter = mapOfDecimals.entrySet()
                                                             .stream()
                                                             .map(Map.Entry::getValue)
                                                             .filter(this::isInteger)

No, ale dochodzę do momentu, gdzie posiadam tylko Stream wartości, bez kluczy, a potem muszę wyświetlić te klucze...

Z góry dziękuję za pomoc

0

Możesz pominąć map i zrobić coś takiego

Map<Integer, BigDecimal> mapAfter = mapOfDecimals.entrySet()
                                                 .stream()
                                                 .filter(x -> isInteger(x.getValue()))
                                                 .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

0

Hm, przy Map.Entry::getKey oraz Map.Entry::getValue wyskakuje Non-static method cannot be referenced from a static context.

0

Tak wygląda cała klasa, wszystkie funkcje w niej:

public HashMap<Integer, BigDecimal> makeOperations() {
        HashMap<Integer, BigDecimal> bigDecimalMap = new HashMap<>();
        for(int i = 0; i < 2000; i++) {
            BigDecimal bigDecimalNumber = new BigDecimal(2);
            bigDecimalNumber = bigDecimalNumber.pow(i);
            bigDecimalNumber = bigDecimalNumber.subtract(new BigDecimal(2));
            bigDecimalNumber = bigDecimalNumber.divide(new BigDecimal(i));
            bigDecimalMap.put(i, bigDecimalNumber);
        }
        return bigDecimalMap;
    }

    public boolean isInteger(BigDecimal number) {
            return number.setScale(0, RoundingMode.HALF_UP).compareTo(number) == 0;
    }

    public String printPrimes(HashMap<Integer, BigDecimal> mapOfDecimals) {
        HashMap<Integer, BigDecimal> mapAfter = mapOfDecimals.entrySet()
                                                             .stream()
                                                             .filter(x -> isInteger(x.getValue()))
                                                             .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));



    }

@jarekr000000

0
sacul napisał(a):
    public String printPrimes(HashMap<Integer, BigDecimal> mapOfDecimals) {
        HashMap<Integer, BigDecimal> mapAfter = mapOfDecimals.entrySet()
                                                             .stream()
                                                             .filter(x -> isInteger(x.getValue()))
                                                             .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

    }

Błąd jest w tym, że Collectors.toMap(...) zwraca Map, a nie HashMap.
Zrób Map<Integer, BigDecimal> mapAfter = mapOfDecimals.entrySet() ... i będzie dobrze.

Jakkolwiek nie rozumiem komunikatu błędu kompilatora (też przy HashMap mam non-static method..., coś tam się dziwnego odwaliło :-).

EDIT:
Ten błąd - czyli niepoprawny komunikat błędu - to problem Intelllij, a nie javac. I niby jest już naprawiony... ale u mnie w 2018.2.5 nadal się pojawia:
https://youtrack.jetbrains.com/issue/IDEA-168200

0

Też właśnie czytałem o tym bugu, który mówił że jest to błąd IntelliJ i podobno został naprawiony, ale jednak nie.. W takim razie wystarczyło tylko tyle, dziękuję bardzo.

1 użytkowników online, w tym zalogowanych: 0, gości: 1