Tag: java 8

Java 8中默认或Defender方法的用途

Java 8包含了一个名为Defender方法的新function,它允许在界面中创build默认的方法实现。 现在首先这是Java中所有精简程序员的巨大转变。 我查看了Brain Goetz给出的一个JavaOne 13演示文稿,他正在讨论Collections库中新的stream()和parallelStream()实现。 为了在Collection接口中添加新的方法,他们不能在不破坏以前的版本的情况下添加新的方法。 所以他告诉说,为了配合这个,添加了Default方法的一个新特性。 public interface SimpleInterface { public void doSomeWork(); //A default method in the interface created using "default" keyword default public void doSomeOtherWork(){ System.out.println("DoSomeOtherWork implementation in the interface"); } } 现在我的问题基本上是默认的方法只需要添加新的方法接口而不破坏客户端代码有帮助吗? 或者还有其他一些用途吗?

Java 8中的方法引用caching一个好主意?

考虑我有如下的代码: class Foo { Y func(X x) {…} void doSomethingWithAFunc(Function<X,Y> f){…} void hotFunction(){ doSomethingWithAFunc(this::func); } } 假设hotFunction经常被调用。 那么cachingthis::func可能是这样的: class Foo { Function<X,Y> f = this::func; … void hotFunction(){ doSomethingWithAFunc(f); } } 就我对java方法引用的理解而言,虚拟机在使用方法引用时会创build一个匿名类的对象。 因此,caching引用只会创build一个对象,而第一个方法在每个函数调用时创build该对象。 它是否正确? 是否应该caching代码中的热位置的方法引用,或者是能够优化这个并使caching变得多余的虚拟机? 有没有关于这个的一般的最佳实践,或者是这个高度虚拟机实现特定的caching是否有用?

Java 8:计算两个LocalDateTime之间的差异

我正在计算两个LocalDateTime之间的差异。 输出需要格式为y years m months d days h hours m minutes s seconds 。 这是我写的: import java.time.Duration; import java.time.Instant; import java.time.LocalDateTime; import java.time.Period; import java.time.ZoneId; public class Main { static final int MINUTES_PER_HOUR = 60; static final int SECONDS_PER_MINUTE = 60; static final int SECONDS_PER_HOUR = SECONDS_PER_MINUTE * MINUTES_PER_HOUR; public static void main(String[] args) { […]

为什么应该在参数中使用Java 8的Optional

我读过很多网站可选应该只用作返回types,而不是在方法参数中使用。 我正在努力寻找一个合乎逻辑的理由。 例如,我有一个有2个可选参数的逻辑。 因此,我认为这样写我的方法签名是有意义的(解决scheme1): public int calculateSomething(Optional<String> p1, Optional<BigDecimal> p2 { // my logic } 许多网页指定可选不应该被用作方法参数。 考虑到这一点,我可以使用下面的方法签名,并添加一个明确的Javadoc注释来指定参数可能为空,希望将来的维护人员将读取Javadoc,因此总是使用参数之前进行空检查(解决scheme2) : public int calculateSomething(String p1, BigDecimal p2) { // my logic } 或者,我可以用四种公共方法replace我的方法,以提供更好的接口,并使其更明显p1和p2是可选的(解决scheme3): public int calculateSomething() { calculateSomething(null, null); } public int calculateSomething(String p1) { calculateSomething(p1, null); } public int calculateSomething(BigDecimal p2) { calculateSomething(null, p2); } public int […]

java.time.Clock.systemDefaultZone()。getZone()与java.util.TimeZone.getDefault()。toZoneId()之间的任何区别?

考虑到java.time.Clock.systemDefaultZone().getZone()和java.util.TimeZone.getDefault().toZoneId()返回相同的输出,两者之间是否有区别。 例如这个代码 import java.time.Clock; import java.util.TimeZone; public class Main { public static void main(String[] args) { System.out.println("Clock.systemDefaultZone().getZone() : " + Clock.systemDefaultZone().getZone()); System.out.println("TimeZone.getDefault().toZoneId() : " + TimeZone.getDefault().toZoneId()); } } 返回这个输出 Clock.systemDefaultZone().getZone() : Europe/Paris TimeZone.getDefault().toZoneId() : Europe/Paris

finalize()在Java 8中调用强可到达的对象

我们最近将我们的消息处理应用程序从Java 7升级到了Java 8.自从升级之后,我们偶然发现一个stream正在被读取时closures的exception。 日志logging显示终结器线程正在调用持有stream的对象的finalize() (它依次closuresstream)。 代码的基本概述如下: MIMEWriter writer = new MIMEWriter( out ); in = new InflaterInputStream( databaseBlobInputStream ); MIMEBodyPart attachmentPart = new MIMEBodyPart( in ); writer.writePart( attachmentPart ); MIMEWriter和MIMEBodyPart是本土MIME / HTTP库的一部分。 MIMEBodyPart扩展HTTPMessage ,它具有以下内容: public void close() throws IOException { if ( m_stream != null ) { m_stream.close(); } } protected void finalize() { try […]

Java中的箭头运算符' – >'是做什么的?

在通过一些代码search时,我碰到了箭头运算符,它究竟做了什么? 我以为Java没有箭头运算符。 return (Collection<Car>) CollectionUtils.select(listOfCars, (arg0) -> { return Car.SEDAN == ((Car)arg0).getStyle(); }); 详细信息 :Java 6,Apache Commons Collection,IntelliJ 12 更新/回答:事实certificate,IntelliJ 12支持Java 8,它支持lambda,并“折叠”Predicates并将它们显示为lambdaexpression式。 以下是“未折叠”的代码。 return (Collection<Car>) CollectionUtils.select(listOfCars, new Predicate() { public boolean evaluate(Object arg0) { return Car.SEDAN == ((Car)arg0).getStyle(); } });

在java.time.LocalDateTime和java.util.Date之间进行转换

Java 8有一个全新的date和时间API。 此API中最有用的类之一是LocalDateTime ,用于保持与时区无关的date和时间值。 为此,使用旧类java.util.Date可能有数百万行代码。 因此,在连接新旧代码时,需要在两者之间进行转换。 由于似乎没有直接的办法来完成这个,怎么办呢?

Javatypes推断:在Java 8中引用是不明确的,但不是Java 7

可以说我们有两个class。 一个空的Base类和这个Derived类的一个子类。 public class Base {} public class Derived extends Base {} 那么我们在另一个类中有几个方法: import java.util.Collection public class Consumer { public void test() { set(new Derived(), new Consumer().get()); } public <T extends Base> T get() { return (T) new Derived(); } public void set(Base i, Derived b) { System.out.println("base"); } public void set(Derived d, Collection<? extends […]

在Java中显式调用默认方法

Java 8引入了默认方法来提供扩展接口的能力,而无需修改现有的实现。 我想知道是否有可能明确调用方法的默认实现时,由于在不同的接口冲突的默认实现,已被重写或不可用。 interface A { default void foo() { System.out.println("A.foo"); } } class B implements A { @Override public void foo() { System.out.println("B.foo"); } public void afoo() { // how to invoke A.foo() here? } } 考虑到上面的代码,你将如何从类B的方法调用A.foo() ?