Metody z klasy stream.

0

Dzień dobry.
Chciałem się nauczyć metod z klasy stream, pisząc dość prosty program. Chodzi o to, żeby wypisał wszystkie Punkty w których Y = 0. Tylko problem jest że Intellij wyrzuca błąd ClassNotFoundException mimo, że w katalogu src jest klasa Punkt (pola to int x i int y).

  ArrayList<Punkt> lista = new ArrayList<Punkt>();
        Random generator = new Random();
        for (int i = 0; i < 100; i++) {
            lista.add(new Punkt(i, generator.nextInt(10)));
        }

        lista.stream()
                .filter(Punkt -> Punkt.getY()==0)
                .map((Punkt punkt) -> ("X: "+ punkt.getX() + " Y: "+ punkt.getY() ))
                .forEach(Punkt -> System.out.println(Punkt));
    }

Mógłby mi ktoś wytłumaczyć też składnię metory filter i map?
Chciałbym się też dowiedzieć czy metody z klasy stream są używane? Tzn takie jak .map, .filter itd.
Z góry dziękuje.

1
  1. Są używane.

Jak chcesz być full functional to od razu tak, bez tego fora:

import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

class Point {
    private final int y;
    private final int x;

    Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    int getY() {
        return y;
    }

    int getX() {
        return x;
    }
}

public class StreamTest {
    public static void main(String[] args) {
        Random generator = new Random();
        List<Point> list = IntStream.range(0, 100)
                .mapToObj(i -> new Point(i, generator.nextInt(10)))
                .collect(Collectors.toList());

        list.stream()
                .filter(point -> point.getY() == 0)
                .map(point -> ("X: " + point.getX() + " Y: " + point.getY()))
                .forEach(System.out::println);
    }
}

Albo w ogóle:

        IntStream.range(0, 100)
                .mapToObj(i -> new Point(i, generator.nextInt(10)))
                .filter(point -> point.getY() == 0)
                .map(point -> ("X: " + point.getX() + " Y: " + point.getY()))
                .forEach(System.out::println);
0

Jeśli można wiedzieć , co robi funkcja map()? I mapToObj()?

0

map wywołuje podaną funkcje na wszystkich elementach strumienia i zwraca strumień z wartościami, mapToObj robi w zasadzie to samo, ale pozwala mapować prymitywy na obiekty. W sumie nie wiem z czego dokładnie wynika to rozgraniczenie, pewnie jakiś problem z implementacją i faktem że Java nie pozwala parametryzować typów generycznych prymitywami (tzn nie da się zrobić List<int>).

0

@Shalom a mógłbym Ciebie jeszcze o coś poprosić? Napisałbyś prosty kod z wykorzystaniem .map .filter i .foreach wypisujący np sumę parzystych elementów listy? Bo za bardzo nie wiem jak się tego używa.

1

Na przykład tak:

  1. Generujemy losowe dane:
        Random random = new Random();
        List<Integer> data = IntStream.range(0, 100)
                .mapToObj(i -> random.nextInt(10))
                .collect(Collectors.toList());
  1. Sumujemy:
        int sum = data.stream()
                .filter(x -> x % 2 == 1)
                .mapToInt(x -> x)
                .sum();

Nie ma co używać foreach skoro mamy tylko jedną wartość do wypisania ;] Sumowanie można by też zrobić tak:

        int sum = data.stream()
                .filter(x -> x%2 == 1)
                .collect(Collectors.summingInt(x -> x));

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.