当前位置: 首页 > 面试题库 >

有状态和无状态lambda表达式有什么区别?

周宸
2023-03-14
问题内容

根据OCP的书,必须避免有状态操作,否则称为有状态lambda表达式。本书中提供的定义是“有状态的lambda表达式,其结果取决于在管道执行期间可能更改的任何状态”。

它们提供了一个示例,其中使用并行流使用.map()函数将固定的数字集合添加到同步的ArrayList 。

arraylist中的顺序是完全随机的,这应该使人看到有状态的lambda表达式在运行时会产生不可预测的结果。因此,强烈建议在使用并行流时避免有状态操作,以消除任何潜在的数据副作用。

它们没有显示提供相同问题的解决方案的无状态lambda表达式(将数字添加到同步数组列表),而且我仍然不明白使用map函数用数据填充空的同步数组列表会带来什么问题。
..管道执行期间可能会改变的确切状态是什么?他们是在指数组列表本身吗?就像当并行流仍在添加数字并因此改变最终结果的过程中另一个线程决定将其他数据添加到ArrayList时一样?

也许有人可以为我提供一个更好的示例,以说明有状态的lambda表达式是什么以及为什么应避免使用它。这将不胜感激。

谢谢


问题答案:

为了尝试举一个例子,让我们考虑以下内容Consumer(注意:这种功能的有用性在这里并不重要):

public static class StatefulConsumer implements IntConsumer {

    private static final Integer ARBITRARY_THRESHOLD = 10;
    private boolean flag = false;
    private final List<Integer> list = new ArrayList<>();

    @Override
    public void accept(int value) {
        if(flag){   // exit condition
            return; 
        }
        if(value >= ARBITRARY_THRESHOLD){
            flag = true;
        }
        list.add(value); 
    }

}

它是一个将向其中添加项目的消费者List(让我们既不考虑如何获取列表又不考虑线程安全性),并具有一个标志(表示状态)。

其背后的逻辑是,一旦达到阈值,消费者应停止添加商品。

您的书试图说的是,因为没有确定的顺序,函数将必须使用的元素Stream,因此输出是不确定的。

因此,它们建议您仅使用无状态函数,这意味着它们将始终在相同的输入下产生相同的结果。



 类似资料:
  • 问题内容: 我试图了解React的有状态和无状态组件之间的确切区别。好的,无状态组件只会做某事,但是什么也不会记住,而有状态组件可能会做同样的事情,但是它们会记住其中的内容。那是理论。 但是现在,在检查如何使用代码显示此内容时,我有点麻烦了。以下两个示例对吗?唯一的区别确实是函数的定义。 无状态组件的示例: 有状态组件的示例: 问题答案: 是的,那是有区别的。除了有 状态 组件,您还可以使用以下方

  • 在接口流中: 中间操作可分为有状态和无状态。它们影响并行流的结果。 只有两个终端操作是非确定性方法:findAny()和forEach(Consumer)。它们影响并行流的结果。 如果中间无状态操作执行惰性操作,它们可能会产生副作用。这会影响并行Stream的结果。 中间操作可分为以下几类: 有状态 不同的() 排序() 极限(长l) 跳过(长l) 无国籍 地图(功能f) 以下是我的两个问题: >

  • Drools中无状态会话和有状态会话的区别是什么。我浏览了不同的文件,发现下面 无状态会话执行规则时事实的任何更改都不会被规则引擎察觉,因此如果任何规则被修改,则不会发生其他规则的重新激活。 我试图执行下面的规则,发现了相同的结果

  • HTTP 和< code>308状态代码有什么区别? > (永久移动):此请求和所有将来的请求都应定向到给定的URI。 (永久重定向):应该使用另一个URI重复请求和所有未来的请求。 他们似乎很相似。

  • 问题内容: 我正在阅读Java EE 6教程,试图理解无状态会话bean和有状态会话bean之间的区别。如果无状态会话bean在方法调用之间没有保持其状态,为什么我的程序按原样运行? 客户端 我原本希望getNumber每次都返回0,但它返回1,并且在浏览器中重新加载servlet会使它更多。问题在于我对无状态会话Bean如何工作的理解,而与库或应用程序服务器无关。有人可以给我一个无状态会话bea

  • 本文向大家介绍描述下在react中无状态组件和有状态组件的区别是什么?相关面试题,主要包含被问及描述下在react中无状态组件和有状态组件的区别是什么?时的应答技巧和注意事项,需要的朋友参考一下 1,无状态组件主要用来定义模板,接收来自父组件props传递过来的数据,使用{props.xxx}的表达式把props塞到模板里面。无状态组件应该保持模板的纯粹性,以便于组件复用。创建无状态组件如下: v