根据条件声明最终变量,并在java中的lambda中使用它

时间:2017-10-04 21:13:03

标签: java lambda

我有以下情况。

我想在lambda表达式中使用变量。但是这个变量将根据条件具有一次性值(最终)。

  final String constraintsAmount;
  if(constraint.isPresent()) {
       constraintsAmount = constraint.getValue();
  }

在此之后,我开始使用forEach + lambda表达式迭代列表。 现在我必须在此迭代中使用此constraintsAmount字段。

但它表示" constraintsAmount可能尚未初始化"。

我怎样才能解决这个问题。

注意: 1)我不想将此变量声明为实例变量,我当然不想在迭代中声明和初始化此变量。 2)因为它是最终的我不能初始化它然后在if检查中重用它。所以想要检查一下是什么工作。

3 个答案:

答案 0 :(得分:1)

从编译器的角度来看,你需要一个else块:

final String constraintsAmount;
  if(constraint.isPresent()) {
    constraintsAmount = constraint.getValue();
  } else {
    constraintsAmount = ...
  }

三元运算符更好:

final String constraintsAmount = constraint.isPresent() ? constraint.getValue() : ...

注意:在Java 8中,您不需要声明变量final以在"关闭"中使用它。 (里面的lambda东西)。

或许您可能需要完全重新设计代码。很难说,因为我没有足够的信息。

答案 1 :(得分:0)

Assumimg constraintOptional<String>您可以执行以下操作:

String constraintsAmount = constraint.orElse(<somedefault>);

否则,如果您只想在constraint具有值时执行某些操作,请执行以下操作:

constraint.ifPresent(constraintsAmount -> { .... });

答案 2 :(得分:0)

在使用之前,必须显式初始化局部变量 您的问题并非特定于final修饰符或使用lambda表达式。

如果此条件为trueif(constraint.isPresent()) {constraintsAmount已初始化。但在相反的情况下,它没有初始化。 因此,如果您使用此变量,编译器就不会接受它。

此代码说明了问题:

  final String constraintsAmount;
  if(constraint.isPresent()) { // initialized
       constraintsAmount = constraint.getValue();
  }
  // if the conditional statement is false, the constraintsAmount var is not initialized

  // So the compiler generates the error 
  // constraintsAmount might not have been initialized

  String lowerCaseString = constraintsAmount.toLowerCase();

constraintsAmount声明中的值else 或者删除final以为变量提供默认值。