gpt4 book ai didi

使用map进行多次调用的Java流检查结果

转载 作者:行者123 更新时间:2023-12-01 12:00:53 24 4
gpt4 key购买 nike

关于正确使用流和 map ,我有以下问题。
问题如下
我有一种方法可以从输入中读取文件并将记录插入数据库中,简而言之,它执行了一些 副作用
此外,同一个函数返回某种状态,让我们说一个 boolean 值(我对此有一定的自由度)表明函数运行良好。

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 这样的函数可以吗:
  • 其主要目的是产生副作用


  • 其返回值的目的只是给出所执行操作的状态(成功与否)而不是其他类型的数据

  • 在 map 内以计算产量 == 真的数量?
    还是我搞砸了,有更好的解决方案来处理这个问题?

    最佳答案

    有两个答案。
    第一:是的,它有效。你可以这样做。
    第二:不要这样做!流用于函数式编程,而函数式编程则是为了避免副作用。这是一种误用,可能会造成混淆。想想更复杂的情况!熟悉函数式编程的人可能不会想到这种误用。
    这意味着:如果您有带有副作用或有状态操作的命令式代码,则不应使用流。在这种情况下,每个循环的经典是更好的选择。这是一个风格问题。在许多情况下(比如这个),使用流的解决方案运行良好,但风格不佳。
    另一个问题:当您避免流中的副作用时,您可以轻松地将它们更改为并行执行。
    顺便说一句,filter(x -> x.equals(true))可以简化为filter(x -> x) .

    关于使用map进行多次调用的Java流检查结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63475501/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com