是否有可能合理地模拟收益语法,也许在Java 8的帮助下?
我今天正在尝试这个问题,来自欧拉问题:
回文数字的读法在两种方式上都是一样的。由两个2位数字的乘积组成的最大回文是9009 = 91 ×99。
找到由两个3位数字的乘积制成的最大回文。
我想过它,它当然可以用for循环来完成,但是我想使用Java 8,因为它开辟了新的选择。
然而,首先,我不知道如何生成一个产生此类元素的函数,所以我最终仍然使用正常的for循环:IntStream
public class Problem4 extends Problem<Integer> {
private final int digitsCount;
private int min;
private int max;
public Problem4(final int digitsCount) {
this.digitsCount = digitsCount;
}
@Override
public void run() {
List<Integer> list = new ArrayList<>();
min = (int)Math.pow(10, digitsCount - 1);
max = min * 10;
for (int i = min; i < max; i++) {
for (int j = min; j < max; j++) {
int sum = i * j;
if (isPalindrome(sum)) {
list.add(sum);
}
}
}
result = list.stream().mapToInt(i -> i).max().getAsInt();
}
private boolean isPalindrome(final int number) {
String numberString = String.valueOf(number);
String reversed = new StringBuilder(numberString).reverse().toString();
return (numberString.equals(reversed));
}
@Override
public String getName() {
return "Problem 4";
}
}
正如你所看到的,我可能有点懒惰,有点真的是一个非常好的方法,我认为最好使用它,就像自己写一样。IntStream::max
不过,问题来了,我需要有一个现在才能以这种方式获得最大值,这意味着我需要存储数据,我真的不应该这样做。list
那么,现在的问题是,是否有可能在Java 8中实现这一点?
for (int i = min; i < max; i++) {
for (int j = min; j < max; j++) {
yield i * j;
}
}
然后从该方法中创建一个(取消框版本,还是直接创建一个?
然后得到答案将非常容易实现。PrimitiveIterator.OfInt
Iterator<Integer>
IntStream
streamFromYield.filter(this::isPalindrome).max().getAsInt()
最后,我知道这个问题以前已经问过了,但是上一次已经很久了,现在Java 8很快就会发生,他们已经添加了大概念和新的语言结构,称为lambdas。
因此,现在编写这样的代码可能与人们为Java 6或7编写代码时非常不同。Stream<T>