我处于这样的情况,希望使用可变版本的Integer之类的东西。我必须使用下面这些类吗?还是Java中有内置的东西可以使用?
http://www.java2s.com/Code/Java/Data-Type/Amutableintwrapper.htm
如果为了避免包含一个可变包装类的代码过于繁琐,您可以将值始终包装在数组中,例如 int[] mutable = {1};
。
Java并没有内置这些功能,这是有原因的。使用可变类型是危险的,因为它们很容易被误用。此外,实现它非常容易。例如,commons-lang有一个MutableInt
。
JDK 1.5以后引入了java.util.concurrent.atomic.AtomicInteger
。
这是一个线程安全的可变整数类型,以下是使用示例:
final AtomicInteger value = new AtomicInteger(0);
之后发生了这样的事情:value.incrementAndGet();
这是我为可变整数编写的一个小型类:
public class MutableInteger {
private int value;
public MutableInteger(int value) {
this.value = value;
}
public void set(int value) {
this.value = value;
}
public int intValue() {
return value;
}
}
你可以轻松地将此扩展到任何其他基元。当然,就像其他人所说的那样,你应该谨慎使用它。
MutableInteger
、MutableDouble
、MutableString
等等,而是有一个 Mutable<Integer>
、Mutable<Double>
等等。使用 Integer
而不是 int
的内存开销通常不会被考虑在内。但是你可以得到一个单一的、可直接使用的类,可以处理大多数情况(如果你想让你的整数可比较或类似的事情,你仍然需要子类化)。 - Qw3ryAtomicInteger
已经被提到过了。可以使用 AtomicReference<Double>
来模拟可变的 Double
。前面提到的警告仍然适用,这种方式不太合理,但有时候你会遇到这样的代码。
double sum=0
for (Data data:someListGenerator())
sum+=data.getValue()
我希望将其重构为Java 8函数式风格。如果代码遵循这种模式但会增加相当的复杂性,最明智的转换方式可能是
AtomicReference<Double> sumref=new AtomicReference<>(0d);
someStreamGenerator().forEach(data->
sumref.set(sumref.get().doubleValue()+data.getValue()));
double sum=sumref.get().doubleValue();
ResultSet
中。这使得将代码转换为适当的功能样式变得非常困难。根据上述模式转换累加部分对我来说似乎是在清理代码和过度简化重构之间的合理折衷。someStreamGenerator().mapToDouble(Data::getValue).sum()
。即使要累积三个不同的信息,也可以通过使用Stream.reduce
或Stream.collect
来实现“函数式”的方式。我看不出将每个循环重构为函数式代码片段的理由,但如果你想走这条路,就应该一直走到底。 - Tobias Liefkefor
和foreach
可以成为复杂框架的一部分,这些框架已经被功能性地重写,因此您必须在它们周围以某种方式对齐其余代码。 - Dirk Hillbrechtfinal
,int
类型始终可变。 - Peter LawreyInteger
并不是可变的。 - mjaggardInteger
实例即使引用它们是可变的,但这是不同的类型。 - Peter Lawreyint
不可变是因为如果你将其传递给一个方法,该方法无法更改其值并在调用方法中反映新的值。 - Adam Burleypublic static void triple(IntHolder x){
x.value = 3 * x.value;
}
IntHolder mutableInt = new IntHolder(10);
triple(mutableInt);
System.out.println(mutableInt.value);
class FoodItem { int calories; }
),因为这样更清晰,如果需要,还可以添加方法。 - GKFXint
不起作用,因为如果它在一个方法中被增加,那么该值不会反映在另一个方法中。 - Adam Burley