Java 8 如何在流使用Java8运行时获取流中的新用户输入

Java 8 如何在流使用Java8运行时获取流中的新用户输入,java-8,java-stream,Java 8,Java Stream,我需要验证用户输入,如果它不符合条件,那么我需要用正确的输入替换它。到目前为止,我被困在两个部分。我对java8还比较陌生,对所有的库都不太熟悉,所以如果你能给我一些建议,让我在哪里阅读更多关于这些库的内容,我将不胜感激 List<String> input = Arrays.asList(args); List<String> validatedinput = input.stream() .filter(p -> { if (p.matche

我需要验证用户输入,如果它不符合条件,那么我需要用正确的输入替换它。到目前为止,我被困在两个部分。我对java8还比较陌生,对所有的库都不太熟悉,所以如果你能给我一些建议,让我在哪里阅读更多关于这些库的内容,我将不胜感激

List<String> input = Arrays.asList(args);
List<String> validatedinput = input.stream()
   .filter(p -> {
       if (p.matches("[0-9, /,]+")) {
           return true;
       }
       System.out.println("The value has to be positve number and not a character");
       //Does the new input actually get saved here?
       sc.nextLine();
       return false;
   }) //And here I am not really sure how to map the String object
   .map(String::)
   .validatedinput(Collectors.toList());
List输入=Arrays.asList(args);
List validatedinput=input.stream()
.过滤器(p->{
如果(p.matches(“[0-9,/,]+”){
返回true;
}
System.out.println(“值必须是正数,而不是字符”);
//新输入是否真的保存在这里?
sc.nextLine();
返回false;
})//这里我不确定如何映射字符串对象
.map(字符串::)
.validatedinput(Collectors.toList());

这种类型的逻辑不应该用流来完成,而
循环是一个很好的选择

首先,让我们将数据划分为两个列表,一个列表表示有效输入,另一个列表表示无效输入:

Map<Boolean, List<String>> resultSet =
            Arrays.stream(args)
                    .collect(Collectors.partitioningBy(s -> s.matches(yourRegex), 
                                 Collectors.toCollection(ArrayList::new)));
int i = 0;
List<String> invalidInputs = resultSet.get(false);
final int size = invalidInputs.size();    
while (i < size){
     System.out.println("The value --> " + invalidInputs.get(i) +
             " has to be positive number and not a character");
     String temp = sc.nextLine();
     if(temp.matches(yourRegex)){
         resultSet.get(true).add(temp);
         i++;
     }
}
映射结果集=
Arrays.stream(args)
.collect(收集器.partitionby(s->s.matches)(yourRegex),
collection(ArrayList::new));
然后创建while循环,要求用户更正所有无效输入:

Map<Boolean, List<String>> resultSet =
            Arrays.stream(args)
                    .collect(Collectors.partitioningBy(s -> s.matches(yourRegex), 
                                 Collectors.toCollection(ArrayList::new)));
int i = 0;
List<String> invalidInputs = resultSet.get(false);
final int size = invalidInputs.size();    
while (i < size){
     System.out.println("The value --> " + invalidInputs.get(i) +
             " has to be positive number and not a character");
     String temp = sc.nextLine();
     if(temp.matches(yourRegex)){
         resultSet.get(true).add(temp);
         i++;
     }
}
inti=0;
List invalidinput=resultSet.get(false);
final int size=invalidInputs.size();
而(i”+invalidinput.get(i)+
“必须是正数而不是字符”);
字符串温度=sc.nextLine();
if(临时匹配(yourRegex)){
resultSet.get(true)、add(temp);
i++;
}
}
现在,您可以收集所有有效输入的列表,并对其执行您喜欢的操作:

List<String> result = resultSet.get(true);
List result=resultSet.get(true);

你的代码毫无意义,什么是
sc
?您还试图使用
流更改
validatedinput
?这显然不会work@Eugene
Scanner
,只要有一种感觉,OP试图做的事情不应该用流来完成。@Aominè这些天你在读什么书吗?:)作为一个扫描器是有意义的…@Eugene是的,它是扫描器,@Eugene我在你删除它之前收到了你的第一个回复,所以谢谢,正如我上面所说的,我对这一点很陌生,所以我的代码毫无意义,这就是为什么我在这个论坛上获得反馈和建议,你的第一个回复比第二个更有建设性,我从中学到了更多,可惜你删除了它。收集器默认生成的列表不能保证是可变的。所以你需要,
Collectors.partitioning by(…,Collectors.toCollection(ArrayList::new))
来确保有一个列表,你可以
添加到其中。@Aominé我认为流应该优化一直流行的for/foreach循环,所以我们不必这样做。我还想当然地认为,他们会添加一些方法,在传递数据时可以实际操作或编辑数据。简单地说,据我所知,streams的工作方式与汽车工厂中装配线的工作方式相同,在装配线中,不同的人(方法)在同一条线上工作,如果汽车符合条件,则执行需要执行的操作。因此,允许某种类型的值更新的方法更为实用。我想我错了。@Em.C这是一个太宽泛的话题,无法讨论(溪流),有很多关于它的书。然而,一个好的开始是任何你不理解的特定主题,只要在谷歌上搜索它,我很确定会有很多答案;-)@Em.C流不应该取代每个for循环,它们是某些任务的工具箱,您可能在以前的Java版本中使用过循环。但并非所有类型的任务都适用。实际上,你们的汽车装配线是一幅好画。在这样的汽车工厂里,工人不会离开自己的位置去向客户索要缺失的规格或向外部供应商询问额外的零件,对吗?装配线用于批量加工,管理任务或后处理在其外部完成。@Em.C取决于终端操作,例如
.collect(Collectors.collectingAndThen(…,function))
的工作原理与此完全相同,在完成所有其他操作后,将应用
函数。同样,如果没有找到匹配项,则类似于
.findAny().orElseGet(supplier)
的终端将在所有其他操作之后应用supplier(尽管从技术上讲,它不再是流操作的一部分)。有些东西符合心智模型,对于其他人来说,遵循常规代码。毕竟,工具会帮助你,所以使用任何能让任务变得简单的工具…