webentwicklung-frage-antwort-db.com.de

Verwenden von Streams anstelle von for-Schleife in Java 8

int [] numbers = {1,2,3,4,5,6,7,8};
int [] doubleNumbers = new int[numbers.length];
int [] tripleNumbers = new int[numbers.length];


for(int index = 0; index < numbers.length; index++)
{
    doubleNumbers[index] = numbers[index] * 2;  
    tripleNumbers[index] = numbers[index] * 3;
}

System.out.println("Double Numbers");
Arrays.stream(doubleNumbers).forEach(System.out::println);

System.out.println("Triple Numbers");
Arrays.stream(tripleNumbers).forEach(System.out::println);

Ich habe oben Code, wo ich die Zahlen für Schleife und Doppelte und Dreifache verwendet habe und sie in verschiedenen Arrays in einer Schleife gespeichert habe. Kann mir jemand helfen, denselben Code unter Verwendung von Streams mit seiner Map und anderen Methoden zu schreiben, ohne das Zahlenfeld zweimal zu durchlaufen.

6
Sarang Shinde

Sie können es so machen:

IntStream.range(0, numbers.length)
  .forEach(index -> {
    doubleNumbers[index] = numbers[index] * 2;
    tripleNumbers[index] = numbers[index] * 3;
  });
10

Sie können das Verdoppeln und Verdreifachen innerhalb des Streams anwenden:

public static void main(String[] args) {
    int [] numbers = {1,2,3,4,5,6,7,8};

    System.out.println("Double Numbers");
    Arrays.stream(numbers).map(x -> x*2).forEach(System.out::println);

    System.out.println("Triple Numbers");
    Arrays.stream(numbers).map(x -> x*3).forEach(System.out::println);
}

obwohl dies technisch immer noch zweimal über das Array iteriert.

Als Trick könnten Sie stattdessen die Ergebnisse in einer Map sammeln:

    Map<Integer, Integer> m = Arrays.stream(numbers)
        .boxed()
        .collect(Collectors.toMap(
            x -> x*2,
            x -> x*3
        ));
3
jon-hanson

Anscheinend ist Ihre Frage komplizierter als die Verwendung von Java Stream API. Der bessere Weg ist, einige Wrapper-Klassen wie Num.class zu definieren:

class Num {
    private final int value;

    //constructor

    public int powerOf(int index) {
        return Math.pow(value, index);
    }

}

Dann können Sie einfach Ihre Array-Elemente in dieses Objekt einschließen und die powerOf-Methode dort aufrufen, wo Sie sie benötigen. Mit Ihrer Implementierung erstellen Sie unnötige Arrays, um die aktiven Werte zu erhalten. Die Verwendung der Stream-API ist in diesem Fall praktischer:

Arrays.stream(numbers).map(Num::new).forEach(n -> System.out.println("power of 2": + n.powerOf(2));
2
eg04lt3r

Sie können stream mit der forEach-Methode verwenden, um collections von Doubles und Tripeln zu füllen, z.

public static void main(String[] args) {
    int [] numbers = {1,2,3,4,5,6,7,8};
    List<Integer> doubles = new ArrayList<Integer>();
    List<Integer> triples = new ArrayList<>();

    Arrays.stream(numbers)
    .boxed()
    .forEach(n -> {
        doubles.add(n*2);
        triples.add(n*3);
        }
    );

    System.out.println(doubles);
    System.out.println(triples);
}

Ein weiteres Beispiel mit map und collect:

public static void main(String[] args) {
    int [] numbers = {1,2,3,4,5,6,7,8};

    List<Integer> doubles = Arrays.stream(numbers)
    .boxed()
    .map(n -> n*2)
    .collect(Collectors.toList());

    List<Integer> triples = Arrays.stream(numbers)
            .boxed()
            .map(n -> n*3)
            .collect(Collectors.toList());

    System.out.println(doubles);
    System.out.println(triples);
}
1
Darshan Mehta