キー入力の連続

1年前に、標準キー入力させるのに、java.util.Scanner を使用した例を書いた。。。
oboe2uran.hatenablog.com

こんなメソッドを用意して使うのもいいが、

public static String keyIn(String guide){
   System.out.print(guide);
   try(Scanner scan = new Scanner(System.in)){
      return scan.nextLine();
   }
}

これを2回連続 call の実行は、

String s1 = keyIn("s1 --->");
String s2 = keyIn("s2 --->");

Exception in thread "main" java.util.NoSuchElementException: No line found
at java.base/java.util.Scanner.nextLine(Scanner.java:1651)

落ち着いて見直せば当然である。
System.in 標準入力を一旦 CLOSE しているのだから。
では、2回以上連続するキー入力をするには、どうするか?
次のように工夫する。

public static Map<String, String> keyIn(List<String> guides){
   try(Scanner scan = new Scanner(System.in)){
   return guides.stream().collect(()->new HashMap<String, String>()
      ,(r, t)->{
         System.out.print(t + " ---> ");
         r.put(t, scan.nextLine());
      },(r, u)->{});
   }
}

サンプル
キー入力要求ガイドを順に3個並べて、
結果を Map で受け取る。

Map<String, String> map = keyIn(Arrays.asList("s1", "s2", "s3"));
System.out.println(map);

'a', 'b', 'c' を順にキー入力

s1 ---> a
s2 ---> b
s3 ---> c
{s3=c, s1=a, s2=b}

となる。