当前位置: 首页 > 知识库问答 >
问题:

如何在Lambda表达式/块中使用现有的ArrayList?

花稳
2023-03-14

我从转换内部传统的for循环开始,在使用AtomicInteger对计数器变量进行排序时遇到了同样的问题,但不确定如何对arrayList进行排序,而且我也无法在lambda块内定义arrayList,因为它与外部while循环中存在的I变量有依赖关系。

任何帮助都将非常感谢!!!提前道谢。

下面是我的代码片段:-


public String somemethod(ArrayList someValues){
        int i=0;
        String status="Failed";
        
        ArrayList someOtherValues = new ArrayList();
    try
    {
    while ( i < (someValues.size()))
        {
            someOtherValues = (ArrayList) someValues.get(i);
            someOtherValues.replaceAll(t -> Objects.isNull(t) ? "" : t); //converting every null to "" within the arrayList someOtherValues
            int count=4;
            AtomicInteger counter=new AtomicInteger(5);
            if(!someOtherValues.get(0).toString().equals(""))
            {
            while ( count < (someOtherValues.size()))
            {
                
                IntStream.range(0, 3).forEach(k -> {
                someObjectClass someObject=new someObjectClass();
                someOtherObjectClass id = new someOtherObjectClass(someOtherValues.get(0).toString(),someOtherValues.get(count).toString()) //Line where the error is
                someObject=new someObjectClass(id);
                 someObject.setId(id);
                 if(someCondition)
                 {
                     try
                     {
                     someObject.setSomething(someValue); 
                     counter.incrementAndGet()
                     }
                 }
                 someObject.setsomeOtherValues1(someOtherValues.get(1).toString());
                 someObject.setsomeOtherValues2(someOtherValues.get(3).toString())
                }
                 count=counter.get();
                 counter.incrementAndGet();

            }
            }
            i++;

    }
    catch(Exception e)
    {
        return status;
    }
             
        
}

使用Java8streams/lambdas/foreach更改/优化以上函数为更少的代码行是不是真的不可能?

共有1个答案

闽经纬
2023-03-14

一般来说,尝试在lambda定义内部更改外部变量不是一个好主意。但是由于Java关于最终字段和变量的非常松散的概念只适用于赋值,所以还是可以做到的。在带有外部定义的变量的lambda表达式中,唯一不能做的是赋新值。所以这不编译:

List<String> lst = new ArrayList<>();
myLambda = e -> {
  lst = new ArrayList<>(); //this violates the 'final' rule
  lst.add(e);
}

然而,可以调用外部变量的任何方法,即使它改变了变量的状态。这将起作用:

myLambda = e -> {
  lst.add(e);
}

即使您仍然更改了变量lst的状态,这也是合法代码。

 类似资料:
  • 我在尝试使用lambda表达式时遇到了这个错误。

  • 本文向大家介绍在Java中如何使用lambda表达式实现ToLongBiFunction ?,包括了在Java中如何使用lambda表达式实现ToLongBiFunction ?的使用技巧和注意事项,需要的朋友参考一下 ToLongBiFunction<T,U>是来自java.util.function函数包裹。此函数接口接受两个引用类型参数作为输入,并生成长值结果。ToLongBiFunctio

  • 本文向大家介绍在Java中如何使用Lambda表达式实现DoubleToIntFunction?,包括了在Java中如何使用Lambda表达式实现DoubleToIntFunction?的使用技巧和注意事项,需要的朋友参考一下 DoubleToIntFunction是中定义的函数接口java.util.function函数Java8版本引入的包。这个函数接口接受一个双值参数并产生一个int值的结果

  • 本文向大家介绍在Java中如何使用Lambda表达式实现DoubleToLongFunction?,包括了在Java中如何使用Lambda表达式实现DoubleToLongFunction?的使用技巧和注意事项,需要的朋友参考一下 DoubleToLongFunction是一个内置函数接口java.util.function函数Java8中引入的包。此函数接口接受双值参数并生成长值结果。Doubl

  • 本文向大家介绍Java中如何使用lambda表达式实现ToLongFunction ?,包括了Java中如何使用lambda表达式实现ToLongFunction ?的使用技巧和注意事项,需要的朋友参考一下 ToLongFunction<T>是中定义的函数接口java.util.function函数包裹。此函数接口接受引用类型作为输入,并生成长值结果。ToLongFunction<T>接口可用作l

  • 问题内容: 我试图在 jrxml 文件中使用lambda表达式来获取我的字段的值。 我导入了适当的类,但这给了我错误 p无法解析为变量。 如何在 JasperReports 模板中使用Lambda表达式? 例外: 问题答案: 如果您使用的是Eclipse JDT编译器,请首先确保您具有一个相当新的版本。 例如,您可以从Maven获得4.5.1 ,然后将以下属性添加到jasperreports.pr