如何解决使用map的Java流检查多个调用的结果
关于正确使用流和地图存在以下问题。
问题出在以下
我有一种方法,可以从输入中读取文件并将记录插入数据库中,简而言之,它会产生一些副作用
此外,同一函数返回某种状态,比方说一个布尔值(对此我有一定程度的自由度),表明该函数运行良好。
public static boolean execute(String filename){
// Perform some side effects (e.g. write on DB)
return true; // or false according to some criteria;
}
然后,我必须用两个文件来调用它,并且我必须检测至少一个文件是否运行良好(即,如果至少一个执行返回true)
我的简单解决方案是:(一种简化的命令模式版本)
public class Entrypoint {
public static boolean myFunction(String input) {
System.out.println("executed..." + input);
return !input.equals("B");
}
public static void main(String[] args) {
List<String> lst = Arrays.asList("A","B","C","D","E","F");
long callsOk = lst.stream().map(Entrypoint::myFunction)
// .filter(x -> x.equals(true)).count();
.filter(x -> x).count(); // Better,as suggested by Donat
System.out.println("OK=" + callsOk);
}
}
这项工作很好,输出为:
executed...A
executed...B
executed...C
executed...D
executed...E
executed...F
OK=5
是正确的,因为它应该为“ B”失败(返回false)
问题是:
使用像myFunction这样的函数是否可以:
- 主要目的是执行副作用
和
- 其返回值的目的仅仅是提供所执行操作的状态(是否成功),而不提供其他类型的数据
在地图内以便计算产量== true?
还是我搞砸了,有更好的解决方案来解决这个问题?
解决方法
有两个答案。
首先:是的,它有效。您可以这样做。
第二:不要这样做!流用于功能编程,而功能编程是为了避免副作用。这是一种滥用,可能会造成混淆。考虑更复杂的情况!熟悉函数式编程的人可能不会想到这种滥用。
这意味着:如果您具有带有副作用或有状态操作的命令性代码,则不应使用流。在这种情况下,每个循环的经典选择是更好的选择。这是风格问题。在许多情况下(像这样),使用流的解决方案效果很好,但是风格很糟糕。
另一个问题:避免流中的副作用时,可以轻松地将其更改为并行执行。
顺便说一下,filter(x -> x.equals(true))
可以简化为filter(x -> x)
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。