2016-04-03 6 views
1

Im Moment habe ich ein Programm, das den Benutzer fragt, wie viele Strings sie eingeben werden, und dann benutze ich einen IntStream, um so viele durchzugehen und jeden zu einer Liste hinzuzufügen.Ist es möglich, nach einer bestimmten Anzahl von Eingaben zu fragen und etwas damit in einem einzigen Stream zu tun?

final List<String> patterns = new ArrayList<>(); 

final int testCaseNumber = Integer.parseInt(scan.nextLine()); 

IntStream.range(0, testCaseNumber).forEach(i -> patterns.add(scan.nextLine())); 

Dann habe ich eine andere Stream-Operation, die etwas anderes über diese Liste tut.

patterns.stream().forEach(pattern -> doSomething()); 

Gibt es eine Möglichkeit, die Verwendung der Muster List ganz zu überspringen, und gehen Sie einfach direkt aus dem IntStream zur endgültigen forEach() Aussage?

Ich habe versucht mit mapToObj() und peek(), aber keiner funktioniert so, wie ich sie will.

Antwort

3

könnten Sie müssen nur

IntStream.range(0, testCaseNumber) 
     .mapToObj(i -> scan.nextLine()) 
     .forEach(input -> doSomething(input)); 

Dies schafft eine IntStream auf die gewünschte Anzahl der Eingänge von 0 gehen und Karten, die alle von denen, in das, was der Benutzer mit mapToObj eintritt.

Auf der anderen Seite, wenn Sie wollen zunächst alle Eingänge sammeln und verarbeiten sie danach dann werden Sie diejenigen speichern haben:

List<String> inputs = 
    IntStream.range(0, testCaseNumber) 
      .mapToObj(i -> scan.nextLine()) 
      .collect(Collectors.toList()); 
// ... 
inputs.forEach(input -> doSomething(input)); 

Beachten Sie, dass es in diesem Fall wirklich keinen besonderen Grund zu verwenden, die Stream-API und Sie sind wahrscheinlich besser dran mit einer einfachen for-Schleife.

Verwandte Themen