标签: java-8

是否有可能合理地模拟yield-syntax,也许是在Java 8的帮助下?

我今天正在尝试这个问题,来自欧拉问题:

回文数字两种方式相同.由两个2位数字的乘积制成的最大回文是9009 = 91×99.

找到由两个3位数字的乘积制成的最大回文.

我考虑过它,它当然可以用for循环完成,但是我想使用Java 8,因为它打开了新的选项.

但首先,我不知道如何生成IntStream产生这样的元素,所以我仍然使用正常的for循环:

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 …
Run Code Online (Sandbox Code Playgroud)

java iterator yield java-8

14
推荐指数
2
解决办法
2982
查看次数

是否可以在Java 8中扩展枚举?

只是在玩和带有甜味的方式将功能添加到上前enums中的Java枚举toString()方法.

一些进一步的修补让我几乎也添加了一个整洁(即没有抛出异常)反向查找,但有一个问题.据报道:

error: valueOf(String) in X cannot implement valueOf(String) in HasValue
public enum X implements PoliteEnum, ReverseLookup {
overriding method is static
Run Code Online (Sandbox Code Playgroud)

有办法吗?

这里的目的是默默地添加(通过接口实现与defaultpoliteName在链接的答案中添加的lookup方法)一个方法,该方法执行该valueOf功能而不抛出异常.可能吗?现在显然可以扩展enum- 直到现在我的Java主要问题之一.

这是我失败的尝试:

public interface HasName {

    public String name();
}

public interface PoliteEnum extends HasName {

    default String politeName() {
        return name().replace("_", " ");
    }
}

public interface Lookup<P, Q> {

    public Q lookup(P p);
}

public interface …
Run Code Online (Sandbox Code Playgroud)

java enums extend java-8

14
推荐指数
1
解决办法
1万
查看次数

Reader#lines()由于其spliterator中的不可配置的批量大小策略而严重并行化

当流源是a时,我无法实现流处理的良好并行化Reader.在四核CPU上运行下面的代码我首先观察到3个核心,然后突然下降到两个核心,然后是一个核心.整体CPU利用率徘徊在50%左右.

请注意示例的以下特征:

  • 只有6,000行;
  • 每条线需要大约20毫秒来处理;
  • 整个过程大约需要一分钟.

这意味着所有压力都在CPU上,I/O很小.这个例子是一个用于自动并行化的坐鸭.

import static java.util.concurrent.TimeUnit.NANOSECONDS;
import static java.util.concurrent.TimeUnit.SECONDS;

... class imports elided ...    

public class Main
{
  static final AtomicLong totalTime = new AtomicLong();

  public static void main(String[] args) throws IOException {
    final long start = System.nanoTime();
    final Path inputPath = createInput();
    System.out.println("Start processing");

    try (PrintWriter w = new PrintWriter(Files.newBufferedWriter(Paths.get("output.txt")))) {
      Files.lines(inputPath).parallel().map(Main::processLine)
        .forEach(w::println);
    }

    final double cpuTime = totalTime.get(),
                 realTime = System.nanoTime()-start;
    final int cores = Runtime.getRuntime().availableProcessors();
    System.out.println("          Cores: " + cores);
    System.out.format("       CPU …
Run Code Online (Sandbox Code Playgroud)

java parallel-processing java-8

14
推荐指数
2
解决办法
1183
查看次数

如何反射性地调用Java 8默认方法

鉴于这个简单的"Hello World"是Java 8接口,如何通过反射调用其hello()方法?

public interface Hello {
    default String hello() {
        return "Hello";
    }
}
Run Code Online (Sandbox Code Playgroud)

java reflection interface java-8

14
推荐指数
5
解决办法
5265
查看次数

如何在Eclipse中使用Java 8文档

我在Eclipse中看到Java 8的API文档时遇到了问题.这是我遇到的问题的一个例子

Calendar myCalendar = Calendar.getInstance();
Run Code Online (Sandbox Code Playgroud)

如果我鼠标悬停,Calendar那么我会看到所有正确的文档,但是如果我鼠标悬停,getInstance()我会收到一条消息说

注意:此元素没有附加源,并且在附加的Javadoc中找不到Javadoc.

我将rt.jar的Javadoc位置设置为http://docs.oracle.com/javase/8/docs/api/,我也尝试下载文档的本地副本并遇到同样的问题.更改Java 7文档的链接可以解决我遇到的问题.

在寻找方法时,Eclipse似乎使用了错误的锚样式(不确定如何用它来表达它).当它查找该getInstance()方法时,它检查http://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html#getInstance(),但它应该检查

Calendar.html#getInstance--

所有括号和逗号似乎都被Java 8 doc链接中的连字符所取代.我在Eclipse 4.3(Kepler)中遇到过这个问题,4.3用Java 8补丁,现在用4.4(Luna)

有没有办法更新Eclipse,以便它在工具提示中正确显示鼠标中的文档?

java eclipse java-8

14
推荐指数
2
解决办法
1万
查看次数

新的javadoc注释@apiNote

我在LongStream类文档中找到了一个新的未记录的javadoc标记.japadoc标签@apiNote似乎用于详细说明有关方法的一些解释,但没有关于此标记的文档或发行说明.

它的真正目的是什么?它的文件在哪里?

可以在Reduce方法文档中找到使用@apiNote编译的javadoc示例

java javadoc java-8

14
推荐指数
2
解决办法
3251
查看次数

为什么Optional <T>被声明为最终类?

我正在玩下面的问题:在Stream :: flatMap中使用Java 8的Optional,并希望将一个方法添加到自定义中Optional<T>,然后检查它是否有效.
更准确地说,我想添加一个stream()我的CustomOptional<T>,如果没有值,则返回一个空流,或者如果存在,则返回一个包含单个元素的流.

但是,我得出的结论Optional<T>是宣布为最终结论.

为什么会这样?有很多类没有被声明为final,我个人认为没有理由宣布Optional<T>final.

作为第二个问题,为什么所有的方法都不能是最终的,如果担心它们会被覆盖,并且让课程不是最终的?

java java-8

14
推荐指数
1
解决办法
2286
查看次数

class从类型java.util.Set和java.util.List继承spliterator()的无关默认值

我有实现Set和List的类.程序在Java6和Java7中运行良好

public class SetList<V> implements Set<V>, List<V>
{
  ....
}
Run Code Online (Sandbox Code Playgroud)

使用Java 8,这不会编译.错误是

java:class trials.SetList从类型java.util.Set和java.util.List继承spliterator()的无关默认值

爪哇/ UTIL/Set.java:394

 ...
@Override
default Spliterator<E> spliterator() {
    return Spliterators.spliterator(this, Spliterator.DISTINCT);
}
Run Code Online (Sandbox Code Playgroud)

的java/UTIL/List.java

...
@Override
default Spliterator<E> spliterator() {
    return Spliterators.spliterator(this, Spliterator.ORDERED);
}
Run Code Online (Sandbox Code Playgroud)

这是否意味着我不能拥有在Java 8中同时实现Set和List的类?(现在看来已经到了支付技术债务的时候了.)

java technical-debt java-8

14
推荐指数
2
解决办法
2611
查看次数

Java 8是否有尾调用优化?

我尝试在网上挖掘以解答我的问题.我找到了一些与达芬奇项目有关的文件.这被标记为JSR 292,它与在JVM中包含闭包有关.这个项目是否实现了,它是Java 8的一部分吗?

java tail-call-optimization java-8

14
推荐指数
2
解决办法
9512
查看次数

JSR-310中两个不同的基于周的年定义的动机是什么?

这些是包中的两个字段java.time.temporal:

IsoFields.WEEK_BASED_YEAR

WeekFields.ISO.weekBasedYear()

ISO-8601定义了除其他两种日期之外的所谓周日期,即通常的日历日期(包括年,月和日)和顺序日期(包括年和日) ).星期日的格式为YYYY-'W'ww-e.w代表一周的年份,e代表数字ISO-星期几.Y代表以周为基础的年份,与日历年相同,但在日历年的开始或结束时除外,因为基于周的年份与最终可能在上一年开始的周周期相关联.有两条规则对于理解星期日的形成非常重要:

  1. 周总是从周一开始.
  2. 日历年的第一周是包含至少四天的一周.

乍一看,两个JSR-310字段看起来都是相同的,因为ISO-8601只提到了一种基于周的年份.但是等一下,惊喜.让我们考虑以下代码示例:

LocalDate date1 = 
  LocalDate.of(2000, 2, 29).with(IsoFields.WEEK_BASED_YEAR, 2014);
System.out.println("IsoFields-Test: " + date1); // output: 2014-03-01

LocalDate date2 = 
  LocalDate.of(2000, 2, 29).with(WeekFields.ISO.weekBasedYear(), 2014);
System.out.println("WeekFields-Test: " + date2); // output: 2014-02-25
Run Code Online (Sandbox Code Playgroud)

虽然我非常了解第二种变化,但我很惊讶看到第一次约会的不同结果是在其类名中使用"官方"ISO-8601-reference.要解释计算结果:

2000-02-29日期对应于ISO-weekdate-notation中的2000-W09-2,而2014-02-25对应于2014-W09-2,保留了一周中的星期和星期几.到目前为止很好.较小字段的这种保留特性类似于如何更改日历年的规则(在大多数情况下应该保持日历日期中的月份和日期不变).

但结果2014-03-01是什么?这里算法简单地将相应的周日添加了四天,以便考虑字段"日期"(29对25)的差异.我没有找到此行为的任何来源或官方文档.有谁知道我们在哪里可以找到这两个领域之间差异的理由?有关算法行为的任何文档?

更新:

现在,我尝试使用此表达式测试新API的自我一致性,以便找出更好地支持哪两个字段:

System.out.println(
  "14 week-based-years later = "
  + LocalDate.of(2000, 2, 29).plus(14, IsoFields.WEEK_BASED_YEARS));
Run Code Online (Sandbox Code Playgroud)

输出是2014-03-01类似于描述的情况IsoFields.WEEK_BASED_YEAR,尽管我仍然发现2014-02-25(= 2014-W09-2)的结果更合乎逻辑.由于此类时间单元也在类中找到,IsoFields因此行为在类中是自洽的IsoFields.看起来像一个没有文档和非直观的"功能".

我使用的版本是:java.runtime.version = 1.8.0-b132

更多测试:

LocalDate d = LocalDate.of(2014, 3, 1); // 2014-W09-6
System.out.println( …
Run Code Online (Sandbox Code Playgroud)

java iso8601 java-8 java-time

14
推荐指数
1
解决办法
2010
查看次数