有人可以向我解释为什么以下代码:
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) 问题非常简单.我正在尝试使用以下命令在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) 我有我想要这样做的每个元素的列表(使用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)
但我想知道我是否可以进行内联空检查(在第一个选项中)?
例如,我看到很多例子
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)
也许我错过了什么.你能解释一下吗?
给定一个场景的控制器调用业务代码引发异常.我怎样才能以一般方式处理这类例外?
我尝试了这个Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler)方法,但是没有调用它,所以我相信异常会在JavaFX框架内的某个地方被捕获.
我该怎么做才能处理此异常或至少向用户显示一些有用的信息?
我创建了一个报告并将其导出为文本文件,以便在矩阵打印机中打印,但是,作业的结果是一个空白页面.我在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 …
在我的@Repository接口中,我使用包含参数(addressType)的JPQL @Query创建了自定义查找方法.
from Address a where a.addressType = :addressType
在方法中,我没有在参数上指定@Param("addressType").所以我得到了
java.lang.IllegalArgumentException:参数绑定的名称不能为null或为空!对于命名参数,您需要在Java版本<8上使用@Param作为查询方法参数.
好的,这很清楚,但我使用的是Java 8.那么Java 8的特殊之处在哪里呢?
以下测试失败
@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)
问题是测试失败,因为方法引用不相等.
我喜欢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),任何"模板化"这样的工作流程的快捷方式?
谢谢.