标签: java-8

NumberFormat舍入问题仅限Java 8

有人可以向我解释为什么以下代码:

public class Test {
    public static void main(String... args) {
        round(6.2088, 3);
        round(6.2089, 3);
    }

    private static void round(Double num, int numDecimal) {
        System.out.println("BigDecimal: " + new BigDecimal(num).toString());

        // Use Locale.ENGLISH for '.' as decimal separator
        NumberFormat nf = NumberFormat.getInstance(Locale.ENGLISH);
        nf.setGroupingUsed(false);
        nf.setMaximumFractionDigits(numDecimal);
        nf.setRoundingMode(RoundingMode.HALF_UP);

        if(Math.abs(num) - Math.abs(num.intValue()) != 0){
            nf.setMinimumFractionDigits(numDecimal);
        }

        System.out.println("Formatted: " + nf.format(num));
    }
}
Run Code Online (Sandbox Code Playgroud)

给出以下输出?

[me@localhost trunk]$ java Test
BigDecimal: 6.208800000000000096633812063373625278472900390625
Formatted: 6.209
BigDecimal: 6.208899999999999863575794734060764312744140625
Formatted: 6.208
Run Code Online (Sandbox Code Playgroud)

如果你没有看到它:"6.2089"四舍五入到3位给出输出"6.208"而"6.2088"给出"6.209"作为输出.少即是多?

使用Java 5,6或7时结果很好但是这个Java 8给了我这个奇怪的输出.Java版本:

[me@localhost trunk]$ java -version
java version …
Run Code Online (Sandbox Code Playgroud)

java java-8

15
推荐指数
1
解决办法
4276
查看次数

无法使用Java8构建Hadoop 2.4.1

问题非常简单.我正在尝试使用以下命令在Windows上编译Hadoop2.4.1:

mvn clean package -Pdist,native-win -DskipTests -Dtar
Run Code Online (Sandbox Code Playgroud)

有了JAVA_HOME=C:\Program Files\Java\jdk1.7.0_51,它工作正常.

JAVA_HOME=C:\Program Files\Java\jdk1.8.0_05,它没有,并且没有给我以下错误:

[INFO] Apache Hadoop Annotations ......................... FAILURE [4.086s]
---
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.8
.1:jar (module-javadocs) on project hadoop-annotations: MavenReportException: Er
ror while creating archive:
[ERROR] Exit code: 1 - C:\hadoop-src\hadoop-common-project\hadoop-annotations\sr
c\main\java\org\apache\hadoop\classification\InterfaceStability.java:27: error:
unexpected end tag: </ul>
[ERROR] * </ul>
[ERROR] ^
[ERROR]
[ERROR] Command line was: "C:\Program Files\Java\jdk1.8.0_05\jre\..\bin\javadoc.
exe" -J-Dhttp.proxySet=true -J-Dhttp.proxyHost=proxy -J-Dhttp.proxyPort=3128 @op
tions @packages
[ERROR]
[ERROR] Refer to the generated Javadoc files in …
Run Code Online (Sandbox Code Playgroud)

hadoop maven java-8

15
推荐指数
2
解决办法
6775
查看次数

使用lambda的内联过滤避免意外的null

我有我想要这样做的每个元素的列表(使用Java 8):

disabledUsersOnLDAP.stream().forEach(user ->usersRepository.findEnabledByUsername(user.getUserName()).setEnabled(false));
Run Code Online (Sandbox Code Playgroud)

怎么usersRepository.findEnabledByUsername可能会返回null.当然,我可以这样做:

disabledUsersOnLDAP.stream().forEach(user -> {
            UserEntity userEntity = usersRepository.findEnabledByUsername(user.getUserName());
            {
                if (userEntity != null) {
                    userEntity.setEnabled(false);
                }
            }
        });
Run Code Online (Sandbox Code Playgroud)

但我想知道我是否可以进行内联空检查(在第一个选项中)?

java lambda java-8

15
推荐指数
2
解决办法
4万
查看次数

lambda表达式中变量名的约定是什么?

例如,我看到很多例子

int sum = widgets.stream()
                  .filter(w -> w.getColor() == RED)
                  .mapToInt(w -> w.getWeight())
                  .sum();
Run Code Online (Sandbox Code Playgroud)

我们可以在这些lambda表达式中使用任何variableName吗?

我认为变量名称具有约定,并且可以使用专有名称来提高可读性.

例如,如果我在pre-java8中使用w作为Widget,则代码将被避免为不可读.随着java 8的出现发生了什么变化?

   for(Widget w : widgets)
   {
         if(w.getColor() == RED) {
            sum += w.getWeight();
         }
    }
Run Code Online (Sandbox Code Playgroud)

为什么不能像这样编写代码:

int sum = widgets.stream()
                  .filter(widget -> widget.getColor() == RED)
                  .mapToInt(widget -> widget.getWeight())
                  .sum();
Run Code Online (Sandbox Code Playgroud)

也许上面的代码是直接做的,而且只在小部件列表中的小部件上.那么,还有更多:

哪个更易读:

    return  requestHolder.getRequests()
                        .stream()
                        .map(request -> request.getErrorHolder())
                        .flatMap(errorData -> errorData.getErrors().stream())
                        .collect(toList());
Run Code Online (Sandbox Code Playgroud)

要么

    return  requestHolder.getRequests()
                        .stream()
                        .map(t -> t.getErrorHolder())
                        .flatMap(r -> r.getErrors().stream())
                        .collect(toList());
Run Code Online (Sandbox Code Playgroud)

也许我错过了什么.你能解释一下吗?

java lambda java-8

15
推荐指数
1
解决办法
5011
查看次数

JavaFX 8中的常规异常处理

给定一个场景的控制器调用业务代码引发异常.我怎样才能以一般方式处理这类例外?

我尝试了这个Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler)方法,但是没有调用它,所以我相信异常会在JavaFX框架内的某个地方被捕获.

我该怎么做才能处理此异常或至少向用户显示一些有用的信息?

java exception-handling javafx java-8 javafx-8

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

无法在Windows 7中使用Java 8打印文本文件

我创建了一个报告并将其导出为文本文件,以便在矩阵打印机中打印,但是,作业的结果是一个空白页面.我在ubuntu中做了同样的事情并且打印正确.这是一个Java bug吗?

这是我向您展示问题的示例代码:

public class PrintError extends Application {

    public static void main(String args[]) {
        launch(args);
    }

    public void start(Stage stage) throws PrintException {
        PrinterJob printerJob = PrinterJob.createPrinterJob();
        printerJob.showPrintDialog(stage);
        PrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet();
        printRequestAttributeSet.add(new Copies(printerJob.getJobSettings().getCopies()));
        printRequestAttributeSet.add(new JobName("test", Locale.getDefault()));
        DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
        Doc mydoc = new SimpleDoc(ClassLoader.class.getResourceAsStream("/should-be-printed.txt"), flavor, null);
        DocPrintJob job = getPrintService(printerJob.getPrinter().getName()).createPrintJob();
        job.print(mydoc, printRequestAttributeSet);
    }

    private PrintService getPrintService(String name) {
        for (PrintService printService : java.awt.print.PrinterJob.lookupPrintServices()) {
            if (name.equalsIgnoreCase(printService.getName())) {
                return printService;
            }
        }
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

此示例在JavaFx …

java printing javafx java-8

15
推荐指数
1
解决办法
1757
查看次数

Java 8 Spring Data JPA参数绑定

在我的@Repository接口中,我使用包含参数(addressType)的JPQL @Query创建了自定义查找方法.

from Address a where a.addressType = :addressType

在方法中,我没有在参数上指定@Param("addressType").所以我得到了

java.lang.IllegalArgumentException:参数绑定的名称不能为null或为空!对于命名参数,您需要在Java版本<8上使用@Param作为查询方法参数.

好的,这很清楚,但我使用的是Java 8.那么Java 8的特殊之处在哪里呢?

jpa jpql java-8 spring-data-jpa

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

在Java 8中尝试monad

是否有内置的monad支持处理异常处理?类似于Scala的尝试.我问,因为我不喜欢未经检查的例外.

monads java-8

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

两个确切的方法参考不相等

以下测试失败

@Test
public void test() {
    Function<String, Integer> foo = Integer::parseInt;
    Function<String, Integer> bar = Integer::parseInt;
    assertThat(foo, equalTo(bar));
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让它通过?

编辑:我会尝试更清楚地说明我正在尝试做什么.

可以说我有这些课程:

class A {
  public int foo(Function<String, Integer> foo) {...}
}

class B {
  private final A a; // c'tor injected
  public int bar() {
    return a.foo(Integer::parseInt);
  }
}
Run Code Online (Sandbox Code Playgroud)

现在让我说我想为B编写单元测试:

@Test
public void test() {
  A a = mock(A.class);
  B b = new B(a);
  b.bar();
  verify(a).foo(Integer::parseInt);
}
Run Code Online (Sandbox Code Playgroud)

问题是测试失败,因为方法引用不相等.

java java-8

15
推荐指数
1
解决办法
3624
查看次数

使用Java8的可选返回的JPA的最佳实践?

我喜欢Java8的语义.我在我的DAO中使用了很多这样的代码:

  public Optional<User> findBy(String username) {
    try {
      return Optional.of(
        emp.get().createQuery("select u from User u where u.username = :username" , User.class)
        .setParameter("username" , username)
        .setMaxResults(1)
        .getSingleResult()
      );
    } catch (NoResultException e) {
      return Optional.empty();
    }
  }
Run Code Online (Sandbox Code Playgroud)

它运行良好,但这样的代码(尝试捕获NoResultException)散布在我的DAO上.我必须捕捉异常,这会以某种方式降低性能.

我想知道它是否是最好的解决方案?或任何更好的解决方案,没有try-catch?

如果不可能(因为在JPA中定义了NoResultException),任何"模板化"这样的工作流程的快捷方式?

谢谢.

java jpa java-8

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