标签: java-8

使用DateTimeFormatter解析AM/PM时间时的Java 8 DateTimeParseException

我正在尝试使用Java 8 java.time.format.DateTimeFormatter将格式化的字符串解析为java.time.LocalTime对象.但是,我在解析一些输入字符串时遇到了一些问题.当我的输入字符串具有"AM"时,它正确解析,但是当我的字符串具有"PM"时,它会抛出异常.这是一个简单的例子:

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

public class FormatterExample {
    private static final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm a");
    public static void main(String[] args) {
        parseDateAndPrint("08:06 AM");
        parseDateAndPrint("08:06 PM");
    }
    public static void parseDateAndPrint(String time) {
        LocalTime localTime = LocalTime.parse((time), timeFormatter);
        System.out.println(localTime.format(timeFormatter));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

08:06 AM
Exception in thread "main" java.time.format.DateTimeParseException: Text '08:06 PM' could not be parsed: Conflict found: Field AmPmOfDay 0 differs from AmPmOfDay 1 derived from 08:06
    at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1919)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1854)
    at java.time.LocalTime.parse(LocalTime.java:441) …
Run Code Online (Sandbox Code Playgroud)

java parsing date java-8

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

Java 8并行流+ anyMatch - 一旦发现匹配,线程是否会被中断?

如果我在java 8中有并行流,并且我使用anyMatch终止,并且我的集合有一个与谓词匹配的元素,我试图弄清楚当一个线程处理这个元素时会发生什么.

我知道anyMatch是短路的,因此我不希望在处理匹配元素后处理更多元素.我的困惑是关于其他线程发生了什么,可能是在处理元素的中间.我可以想到3个看似合理的场景:a)他们被打断了吗?b)他们是否继续处理他们正在处理的元素,然后,一旦所有线程都无所事事,我得到我的结果?c)我是否得到了我的结果,但是处理其他元素的线程继续处理这些元素(但是一旦完成就不再采用其他元素)?

我有一个长期运行的谓词,一旦我知道一个元素匹配就很快终止它.我担心一点,因为我在文档中找不到它可能是依赖于实现的东西的信息,这也是很好的.

谢谢

java-8

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

如何将Instant转换为LocalTime?

即使在阅读了大量教程之后,我也不是真正了解Temporal Adjusters或Java的新时间库.

如何将Instant对象转换为LocalTime对象.我正在思考以下几点:

LocalTime time = LocalTime.of(
        instantStart.get(ChronoField.HOUR_OF_DAY),
        instantStart.get(ChronoField.MINUTE_OF_HOUR)
    );
Run Code Online (Sandbox Code Playgroud)

但它没有用.我该怎么做?

java datetime java-8

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

来自Nashorn的IllegalArgumentException异常 - 这是Java 8中的错误吗?

我正在使用Nashorn javascript引擎来评估在java应用程序中编写的所有服务器端javascript代码.为了提高性能,我在启动时使用spring初始化JsEngine并评估和缓存所有核心工具,如Mustache和一些常见的JS工具.然后每次屏幕渲染时,这个预先评估的JsEngine将用于评估特定于页面的JavaScript代码.它在某些时候工作正常,意味着它按预期呈现页面,但在我持续点击相同的URL时开始抛出异常

我无法找到问题的根本原因.

@Component
public class JsEngine {

    private ScriptEngine scriptEngine;

    @PostConstruct
    public void init() throws ScriptException, IOException{
        scriptEngine = new ScriptEngineManager().getEngineByName("nashorn");
        this.cacheAllCoreEngines();
        for(String key: defaultEngineSource.keySet()){
            scriptEngine.eval(defaultEngineSource.get(key));
        }
    }

    private void cacheAllCoreEngines()throws IOException{
       //read all core files such as mustache, etc. 
       defaultEngineSource.put("mustache",  FileUtil.readFileFromDisk("<actual path..>/mustache.js"));
    }

    public Object eval(String source) throws  ScriptException{
            .... code to handle exceptions 
            return scriptEngine.eval (source);
    }

}
Run Code Online (Sandbox Code Playgroud)

JsEngine如下所示,

public class AppRendererImpl implements  AppRenderer {

    @Autowired
    JsEngine jsEngine;

    public String render(){
     ....
     .... //Read source from disk …
Run Code Online (Sandbox Code Playgroud)

java spring java-8 nashorn

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

Arrays.asList与Arrays.stream一起使用forEach()

如果您有一个Array并且想要使用Java8 forEach()方法,那么哪种方法更好或更有效:

Arrays.asList(new String[]{"hallo","hi"}).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

要么

Arrays.stream(new String[]{"hallo","hi"}).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

差异是显着的还是有更好的解决方案来解决这个问题?

java lambda java-8 java-stream

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

在Java8中引用具有不同参数的方法

我想知道方法引用和功能接口的所有这些东西如何在较低级别上工作.最简单的例子是我们有一些List

List<String> list = new ArrayList<>();
list.add("b");
list.add("a");
list.add("c"):
Run Code Online (Sandbox Code Playgroud)

现在我们想用Collections类对它进行排序,所以我们可以调用:

Collections.sort(list, String::compareToIgnoreCase);
Run Code Online (Sandbox Code Playgroud)

但是,如果我们定义自定义比较器,它可能是这样的:

Comparator<String> customComp = new MyCustomOrderComparator<>();
Collections.sort(list, customComp::compare);
Run Code Online (Sandbox Code Playgroud)

问题是Collections.sort有两个参数:List和Comparator.由于Comparator是功能接口,因此可以使用具有相同签名(参数和返回类型)的lambda表达式或方法引用替换它.那么它是如何工作的,我们也可以传递compareTo只引用一个参数并且这些方法的签名不匹配?如何在Java8中翻译方法引用?

java java-8 method-reference

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

此表达式的目标类型必须是功能接口

我创建了一个函数来过滤多个谓词,我为它们执行逻辑AND:

@SafeVarargs
public static <T> Stream<T> filter(Stream<T> source, Predicate<T>... predicates) {
    return source.filter(Arrays.stream(predicates).reduce(predicates[0], Predicate::and));
}  
Run Code Online (Sandbox Code Playgroud)

致电时:

filter(IntStream.range(0, 10).boxed(), x -> x % 2 != 0, x -> x%3 == 0).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

它工作正常并打印3和9.但是,当我传递一个谓词,如:

filter(IntStream.range(0, 10).boxed(), x -> x % 2 != 0).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

我收到编译错误:

The target type of this expression must be a functional interface
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

在此输入图像描述 对于infos我使用Eclipse Luna版本1.

java eclipse java-8 eclipse-luna

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

将字节数组转换为IntStream的最佳方法是什么?

Java 8具有java.util.stream.Stream和java.util.stream.IntStream类型.java.util.Arrays有一个方法

IntStream is = Arrays.stream(int[])
Run Code Online (Sandbox Code Playgroud)

但是没有这样的方法可以从byte [],short []或char []创建IntStream,将每个元素扩展为int.是否有一种从byte []创建IntStream的惯用/首选方法,所以我可以以函数方式操作字节数组?

我当然可以手动将byte []转换为int []并使用Arrays.stream(int []),或者使用IntStream.Builder:

public static IntStream stream(byte[] bytes) {
   IntStream.Builder isb = IntStream.builder();
   for (byte b: bytes) 
       isb.add((int) b); 
   return isb.build();
}
Run Code Online (Sandbox Code Playgroud)

但是由于复制了源代码,它们都不是很有用.

似乎没有一种简单的方法可以将InputStream(或者在本例中为ByteArrayInputStream)转换为IntStream,这对于在功能上处理InputStream非常有用.(明显遗漏?)

是否有更有效且不复制的功能方式?

java arrays java-8 java-stream

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

Java 8 JIT线程似乎陷入无限循环

我在Java 8中编写了一个服务器应用程序,并使用java 1.8.0u25运行它.

它在前几个小时工作正常,但在它获得大约5k~10k请求后,VM进程的一个线程使用其中一个CPU的100%.

所以我试图jstack让VM进程检查有问题的线程是什么,并且它表明线程(线程id是14303 = 0x37df)是"C2 CompilerThread0":

"C2 CompilerThread0" #6 daemon prio=9 os_prio=0 tid=0x00002aaabc12a000 nid=0x37df runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
Run Code Online (Sandbox Code Playgroud)

并且jstack -m,线程的堆栈跟踪如下:

----------------- 14303 -----------------
0x00002b99b67693c3  _ZN16PhaseMacroExpand27process_users_of_allocationEP8CallNode + 0x2a3
0x00002b99b676ec3b  _ZN16PhaseMacroExpand23eliminate_allocate_nodeEP12AllocateNode + 0x1cb
0x00002b99b676ee65  _ZN16PhaseMacroExpand21eliminate_macro_nodesEv + 0x1a5
0x00002b99b6772769  _ZN16PhaseMacroExpand18expand_macro_nodesEv + 0x19
0x00002b99b640b01b  _ZN7Compile8OptimizeEv + 0xa6b
0x00002b99b640c53c  _ZN7CompileC1EP5ciEnvP10C2CompilerP8ciMethodibbb + 0x13bc
0x00002b99b635f9c8  _ZN10C2Compiler14compile_methodEP5ciEnvP8ciMethodi + 0x198
0x00002b99b6414c6a  _ZN13CompileBroker25invoke_compiler_on_methodEP11CompileTask + 0xc8a
0x00002b99b6417650  _ZN13CompileBroker20compiler_thread_loopEv + 0x620
0x00002b99b69a2e8f  _ZN10JavaThread17thread_main_innerEv + 0xdf
0x00002b99b69a2fbc  _ZN10JavaThread3runEv + 0x11c
0x00002b99b6860d48  _ZL10java_startP6Thread + 0x108
Run Code Online (Sandbox Code Playgroud)

每一次我尝试一次jstack -m …

java jit jvm java-8

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

JVM 8更新后,Java Sound显着变慢

我的应用程序在启动时加载了一堆音频剪辑.它用于java.applet.Applet.newAudioClip(URL audioFileURL)加载文件,这些文件位于同一文件夹中.我可以看到这个函数基本上是一个获取JavaSoundAudioClip对象的包装器

直到昨天,我用JDK 7编译JAR并使用JRE版本7更新45启动它.然后我更新到版本8更新31.
现在,每个音频的加载比以前多十倍(每个0.2秒,现在它在2到3秒之间)
在不同的硬件配置上发生了相同的行为.操作系统是64位Windows 7,Java 7和8运行时环境都是32位.

在挖掘更深层次的调试,我发现,放慢了大部分的方法是AudioSystem.getAudioInputStream,AudioSystem.isLineSupported,AudioSystem.getLine

不应该涉及音频格式:我尝试了OGG和WAV,结果相同.

两个JVM的设置都是相同的

编辑:即使我无法在ad-hoc的小程序中重现问题.Java 8确实较慢,但只有10%的因素.我的应用程序必须有一些特别的东西,而我正在使用的库与音频系统和/或其流有冲突.我一发现就会更新.

java audio performance jvm java-8

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