我正在尝试使用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 8中有并行流,并且我使用anyMatch终止,并且我的集合有一个与谓词匹配的元素,我试图弄清楚当一个线程处理这个元素时会发生什么.
我知道anyMatch是短路的,因此我不希望在处理匹配元素后处理更多元素.我的困惑是关于其他线程发生了什么,可能是在处理元素的中间.我可以想到3个看似合理的场景:a)他们被打断了吗?b)他们是否继续处理他们正在处理的元素,然后,一旦所有线程都无所事事,我得到我的结果?c)我是否得到了我的结果,但是处理其他元素的线程继续处理这些元素(但是一旦完成就不再采用其他元素)?
我有一个长期运行的谓词,一旦我知道一个元素匹配就很快终止它.我担心一点,因为我在文档中找不到它可能是依赖于实现的东西的信息,这也是很好的.
谢谢
即使在阅读了大量教程之后,我也不是真正了解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)
但它没有用.我该怎么做?
我正在使用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) 如果您有一个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)
差异是显着的还是有更好的解决方案来解决这个问题?
我想知道方法引用和功能接口的所有这些东西如何在较低级别上工作.最简单的例子是我们有一些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中翻译方法引用?
我创建了一个函数来过滤多个谓词,我为它们执行逻辑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 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 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.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%的因素.我的应用程序必须有一些特别的东西,而我正在使用的库与音频系统和/或其流有冲突.我一发现就会更新.