Tag: java 8

如何向上转换Java 8可选对象?

是否有一种有效的方法在使用Optional对象时执行向上转换。 这是一个示例代码: class A{} class B extends A{} B func(){ //do something return new B(); } Optional func2(){ //do something return Optional.of(new B()); } main() { A a = func(); // Upcasting works fine B b = func(); // Upcasting works fine Optional b = func2(); // 1. Upcasting works fine Optional a = func2(); […]

Java 8 findFirst()。isPresent()比count()> 0更有效吗?

鉴于我有一个Stream stream = list.stream().filter(some predicate) ,其中列表非常大,通过执行以下stream.count() > 0来检查流是否为空是更有效的: stream.count() > 0或通过执行: stream.findFirst().isPresent() ?

f:convertDateTime支持Java8 LocalDate / LocalDateTime?

JSF核心标记f:convertDateTime可以格式化java.util.Date对象。 Date类有许多不推荐使用的方法,Java 8提供了新类来显示本地日期和时间: LocalDateTime和LocalDate 。 f:convertDateTime无法格式化LocalDateTime或LocalDate 。 有没有人知道,如果有一个等价的JSF核心标记convertDateTime可以处理LocalDateTime对象? 计划是为将来的版本提供支持,还是提供替代标签?

检测流中的重复组

我想确保列表中的所有数字都组合在一起。 让我用例子解释一下: {1, 1, 1, 2, 2} // OK, two distinct groups {1, 1, 2, 2, 1, 1} // Bad, two groups with “1” {1, 2, 3, 4} // OK, 4 distinct groups of size 1 {1, 1, 1, 1} // OK, 1 group {3, 4, 3} // Bad, two groups with “3” {99, -99, […]

Java8动态代理和默认方法

拥有使用默认方法的接口的动态代理,如何调用默认方法? 通过使用defaultmethod.invoke(this, …)类的东西defaultmethod.invoke(this, …)您只需调用代理调用处理程序(这在某种程度上是正确的,因为您没有此接口的实现类)。 我有一个解决方法,使用ASM创建一个实现接口的类,并将此类调用委托给此类的实例。 但这不是一个好的解决方案,特别是如果默认方法调用其他接口方法(你得到一个委托人ping-pong)。 JLS对这个问题惊讶地保持沉默…… 这是一个小代码示例: public class Java8Proxy implements InvocationHandler { public interface WithDefaultMethod { void someMethod(); default void someDefaultMethod() { System.out.println(“default method invoked!”); } } @Test public void invokeTest() { WithDefaultMethod proxy = (WithDefaultMethod) Proxy.newProxyInstance( WithDefaultMethod.class.getClassLoader(), new Class[] { WithDefaultMethod.class }, this); proxy.someDefaultMethod(); } @Override public Object invoke(Object proxy, Method method, […]

为什么在捕获静态字段值时,等效的lambda表达式和方法引用的行为会有所不同?

我对Java lambdas和方法引用行为有点困惑。 例如,我们有这个代码: import java.util.function.Consumer; public class Main { private static StringBuilder sBuilder = new StringBuilder(“1”); public static void main(String[] args) { Consumer consumer = s -> sBuilder.append(s); sBuilder = new StringBuilder(“2”); consumer.accept(“3”); System.out.println(sBuilder); } } 输出: 23 这可以按预期工作,但如果我们更换 s – > sBuilder.append(s) 同 sBuilder ::追加 输出将是: 2 你有什么想法解释这个吗? 这不是一回事吗? 谢谢。

String.join()vs其他字符串连接操作

我已经快速阅读了Java8 String api文档。 现在我对String.join()方法很好奇,以便连接/连接字符串。 这种例子让我更好地理解: //Old way: String str1 = “John”; String str2 = “Doe”; String result = str1 + ” ” +str2; //or by using str1.concat(str2); //New way: String result = String.join(” “, str1, str2); 不过,我不明白我应该使用哪一个。 这两个过程之间是否有任何性能或其他差异。 任何帮助将不胜感激。

Java 8流运行速度比for循环慢的关键指标?

在大多数情况下,Java 8流允许的代码比旧式for循环更具可读性。 但是,根据我自己的经验和我所读到的内容,使用流而不是for循环可能会导致性能损失(或偶尔会有改进),有时难以预测。 在一个大型项目中,为每个循环编写基准测试似乎不太可行,因此在决定是否用流替换for循环时,关键因素是什么 (例如,预期的集合大小,删除的值的预期百分比通过过滤,迭代操作的复杂性,减少或聚合的类型等,它们可能表明将导致的性能变化? 注意:这是我之前的问题的缩小,因为过于宽泛而关闭(并且并行流的方面在另一个SO问题中得到了很好的覆盖),所以让我们将其限制为顺序流。

使用java 8流将String替换为hashmap值

我有String和HashMap如下面的代码: Map map = new HashMap(); map.put(“ABC”, “123”); String test = “helloABC”; map.forEach((key, value) -> { test = test.replaceAll(key, value); }); 我尝试用HashMap值替换字符串,但这不起作用,因为test是最终的,不能在forEach的主体中重新分配。 那么有没有使用Java 8 Stream API用HashMap替换String解决方案?

如何使用DateTimeFormatter解析非标准月份名称

我需要解析(德语)以下列forms的日期: 10. Jan. 18:14 8. Feb. 19:02 1. Mär. 19:40 4. Apr. 18:55 2. Mai 21:55 5. Juni 08:25 5. Juli 20:09 1. Aug. 13:42 […] 如您所见,如果月份超过4个字符,则会删除月份名称。 甚至更奇怪,不要问我为什么,三月份缩短为Mär. 虽然全名都是März 。 我如何用java.time解析这个? (日期的格式基于创建日期列表的Android设备的本地化。但是,我没有在Android上解析它) 我的方法是创建一个这样的DateTimeFormatter : DateTimeFormatter.ofPattern(“d. MMMM HH:mm”).withLocale(Locale.GERMAN); // or DateTimeFormatter.ofPattern(“d. MMMMM HH:mm”).withLocale(Locale.GERMAN); 但MMMM和MMMMM模式都不适合缩短的日期。 当然,我可以有以下模式d. MMM. HH:mm d. MMM. HH:mm d. MMM. HH:mm以匹配缩短的月份,但后来我无法匹配3个月和4个月的月份。 我知道我可以有两个格式化程序( MMM. and […]