我知道一般理论,但我不能适应细节.
我知道程序驻留在计算机的辅助内存中.程序开始执行后,它将完全复制到RAM中.然后处理器一次检索一些指令(它取决于总线的大小),将它们放入寄存器并执行它们.
我也知道计算机程序使用两种内存:堆栈和堆,它们也是计算机主存储器的一部分.堆栈用于非动态内存,堆用于动态内存(例如,与newC++中的运算符相关的所有内容)
我无法理解的是这两件事是如何联系起来的.用于执行指令的堆栈在什么时候?指令从RAM,堆栈到寄存器?
我试图重构旧代码以使用流,我的第一个方法是这样的:
public void run() throws IOException {
Files.list(this.source)
.filter(Images::isImage)
.map(Image::new)
.filter(image -> image.isProportional(this.height, this.width))
.map(image -> image.resize(this.height, this.width))
.forEach(image -> Images.write(image, this.destination));
}
Run Code Online (Sandbox Code Playgroud)
这不是编译,因为新的Image()和Images.write()抛出IOExceptions.
使用UncheckedIOException包装这些异常将不起作用,因为如果其中一个失败,我不想阻止处理其他图像.
所以我结束了写2个私有方法:
private Optional<Image> createImage(Path imagePath) {
try {
return Optional.of(new Image(imagePath));
} catch (IOException e) {
return Optional.empty();
}
}
private void write(Image image) {
try {
Images.write(image, this.destination);
} catch (IOException e) {
// log error
}
}
Run Code Online (Sandbox Code Playgroud)
createImage()返回一个Optional,因为这看似合理.但是在此之后我的代码变得非常难看:
public void run() throws IOException {
Files.list(source)
.filter(Images::isImage)
.map(this::createImage)
.filter(image -> image.isPresent() && image.get().isProportional(this.height, this.width)) …Run Code Online (Sandbox Code Playgroud) 我正在使用Scala 2.11.2.
如果我有这个Fraction类:
case class Fraction(numerator: Int, denominator: Int) {}
Run Code Online (Sandbox Code Playgroud)
然后这给出了一个错误:
val f = new Fraction(numerator=-1, denominator=2)
Run Code Online (Sandbox Code Playgroud)
但这不是:
val f = new Fraction(-1, denominator=2)
Run Code Online (Sandbox Code Playgroud)
错误消息是:
Multiple markers at this line
- not found: value
numerator
- not found: value
numerator
Run Code Online (Sandbox Code Playgroud)
我尝试在其他片段中使用负数而得到相同的结果,但文档中没有提到这是不可能的.
难道我做错了什么?
谢谢
我正在设计一个用于二十一点游戏的Card类.
我的设计是使用getValue()创建一个Card类,例如返回J为11,Q为12,K为13,然后使用BlackjackCard类扩展它以覆盖该方法,以便这些卡返回10.
然后有些东西击中了我:Card类的对象应该是不可变的.所以我重新阅读了Effective Java 2nd Edition,看看该做什么,我发现不可变类需要是最终的,以避免子类打破不变性.
我也看过互联网,每个人似乎都同意这一点.
Card类应该是最终的吗?
你如何打破这个类的不变性,扩展它:
class Card {
private final Rank rank;
private final Suit suit;
public Card(Rank rank, Suit suit) {
this.rank = rank;
this.suit = suit;
}
public Rank getRank() {
return rank;
}
public Suit getSuit() {
return suit;
}
public int getValue() {
return rank.getValue();
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
我有一个带有此构造函数的 HiddenNumber 类:
\n\npublic HiddenNumber(java.util.Random random, int maxNumberOfDigits) {\n /* some code */\n}\nRun Code Online (Sandbox Code Playgroud)\n\nI\xc2\xb4m 尝试使用 DI 注释:
\n\n@Autowired\npublic HiddenNumber(@Value("T(java.util.Random") random, \n @Value("4")int maxNumberOfDigits) {\n /* some code */\n}\nRun Code Online (Sandbox Code Playgroud)\n\n但这不起作用。我也尝试过:
\n\n@Autowired\npublic HiddenNumber(@Value("#{T(java.util.Random}") random, \n @Value("4")int maxNumberOfDigits) {\n /* some code */\n}\nRun Code Online (Sandbox Code Playgroud)\n\n如果我做:
\n\n@Autowired\npublic HiddenNumber(Random random, @Value("4") int maxNumberOfDigits) {\n /* some code */\n}\nRun Code Online (Sandbox Code Playgroud)\n\n并在 app-context.xml 中执行以下操作:
\n\n<bean class="java.util.Random" />\nRun Code Online (Sandbox Code Playgroud)\n\n工作正常。但当然我更喜欢只做注释。
\n\n注入 java.util.Random 的正确方法是什么?
\n\n谢谢。
\n我曾经写过这样的函数的替代品:
int[][] createMatrix(int height, int width) {
int[][] matrix = new int[height][width];
for (int i = 0; i < height; ++i) {
for (int j = 0; j < width; ++j) {
matrix[i][j] = i * width + j;
}
}
return matrix;
}
Run Code Online (Sandbox Code Playgroud)
但现在,我发现自己再也无法做到了.如何重构代码以在Java 8中使用流?