标签: java-8

在Java 8上设置maven单元测试的时区

如何在Java 8上的maven surefire中设置单元测试的时区?

使用Java 7时,过去常常使用systemPropertyVariables以下配置,但使用Java 8时,测试只使用系统时区.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <systemPropertyVariables>
      <user.timezone>UTC</user.timezone>
    </systemPropertyVariables>
Run Code Online (Sandbox Code Playgroud)

为什么会这样,我该如何解决?

java timezone surefire maven java-8

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

Java 8流和地图值得吗?

感觉就像java 8流和映射函数那么冗长,它们并不是真正的改进.例如,我编写了一些使用集合生成另一个修改过的集合的代码:

private List<DartField> getDartFields(Class<?> model) {
    List<DartField> fields = new ArrayList<>();
    for (Field field : model.getDeclaredFields()) {
        if (!Modifier.isStatic(field.getModifiers())) {
            fields.add(DartField.getDartField(field));
        }
    }
    return fields;
}
Run Code Online (Sandbox Code Playgroud)

这似乎是java 8流及其功能的理想用例,所以我重写了它:

private List<DartField> getDartFields(Class<?> model) {
    return Arrays.asList(model.getDeclaredFields())
            .stream()
            .filter(field -> !Modifier.isStatic(field.getModifiers()))
            .map(field -> DartField.getDartField(field))
            .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

但我不确定我更喜欢那个.这是236个字符,而普通风格的java则是239个字符.它似乎没有或多或少可读.这是很好,你没有申报ArrayList,但需要打电话.collect(Collectors.toList())Arrays.asList(取决于数据类型)是没有任何好转.

使用.stream()这样的东西是否有一些实际的改进,我只是没有得到,或者这只是一个有趣的方式抛出任何同事不知道函数式编程的循环?

我想如果我动态地传递过滤器或映射lambdas它会很有用,但如果你不需要这样做......

java functional-programming java-8 java-stream

24
推荐指数
3
解决办法
5835
查看次数

Java 8流中的聚合运行时异常

假设我有一个抛出运行时异常的方法.我正在使用a Stream来对列表中的项目调用此方法.

class ABC {

    public void doStuff(MyObject myObj) {
        if (...) {
            throw new IllegalStateException("Fire! Fear! Foes! Awake!");
        }
        // do stuff...
    }

    public void doStuffOnList(List<MyObject> myObjs) {
        try {
            myObjs.stream().forEach(ABC:doStuff);
        } catch(AggregateRuntimeException??? are) {
            ...
        }             
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我希望处理列表中的所有项目,并将各个项目的任何运行时异常收集到最终将抛出的"聚合"运行时异常中.

在我的真实代码中,我正在进行第三方API调用,这可能会引发运行时异常.我想确保处理所有项目并在最后报告任何错误.

我可以想出一些方法来解决这个问题,例如map()捕获并返回异常的函数(..shudder ..).但有没有一种本地方式来做到这一点?如果没有,还有另一种方法可以干净利落地实施吗?

java exception-handling java-8 java-stream

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

将java.util.function.Function转换为Interface

在这个(简化的)示例中,我可以MyInterface通过使用方法引用来创建我的对象apply,但是直接转换不起作用.

@Test
public void testInterfaceCast(){
    Function<String, Integer> func = Integer::parseInt;

    MyInterface legal = func::apply; // works
    MyInterface illegal = func; // error
}

public interface MyInterface extends Function<String, Integer>{}
Run Code Online (Sandbox Code Playgroud)

第二个赋值给出了编译器错误:

incompatible types: Function<String,Integer> cannot be converted to MyInterface
Run Code Online (Sandbox Code Playgroud)

这个问题

我可以做一些泛型魔法,能够投射Function<T, R>到界面吗?

java java-8 method-reference

24
推荐指数
2
解决办法
2092
查看次数

Java中是否存在一致的(单调)Clock实现?

默认的java.time.Clock实现基于System.currentTimeMillis().正如这里所讨论的那样, 单调增加Java的时间?,不保证是单调的.

事实上,我经常遇到一种情况,系统时间会自动调整到过去几秒钟,而java时钟也会跳回来.

//now() returns 2016-01-13T22:34:05.681Z
order.setCreationTime(Instant.now());

//... something happens, order gets cancelled

//now() returns 2016-01-13T22:34:03.123Z
//which is a few seconds before the former one,
//even though the call was performed later - in any reasonable sense.
//The recorded history of events is obviously inconsistent with the real world.
order.setCancelationTime(Instant.now());
Run Code Online (Sandbox Code Playgroud)

然后,当人们不能仅依靠一个方向的时间时,就不可能执行时间敏感的事情,例如记录和分析事件历史.

上述帖子说System.nanoTime()是单调的(如果底层系统支持它).所以,如果我想将我的代码基于java.time API,我需要内部使用nanoTime的Clock来确保单向流动的时间.也许这样的事情会起作用.或者不是吗?

public class MyClock() extends java.time.Clock {

    private final long adjustment;

    public MyClock() {
        long cpuTimeMillis = System.nanoTime()/1000000;
        long systemTimeMillis = …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-time

24
推荐指数
1
解决办法
4848
查看次数

C#相当于Java 8"方法参考"

我最近有机会调整一些Java代码,并能够利用一些新的Java 8功能.在一个特定情况下,我需要.Name从对象列表中获取(字符串)属性列表.我所做的一个简单例子是:

// sample data: <Thing> objects have a single String property called "Name" 
List<Thing> thingList =
    new ArrayList<>(Arrays.asList(new Thing("Thing1"), new Thing("Thing2")));

// first pass
List<String> nameList = new ArrayList<>();
thingList.forEach(x -> nameList.add(x.getName()));

// refinement 1: use stream, map, and collect
List<String> nameList1 =
    thingList.stream().map(x -> x.getName()).collect(Collectors.toList());

// refinement 2: use "Thing::getName" method reference
List<String> nameList2 =
    thingList.stream().map(Thing::getName).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我很想知道这些方法将如何转化为C#,我得到了

// sample data: <Thing> objects have a single String property called "Name"
var thingList = new List<Thing> { new …
Run Code Online (Sandbox Code Playgroud)

c# java java-8

24
推荐指数
2
解决办法
4723
查看次数

Junit 测试不适用于 Drools 5.4.0.Final 和 JDK 8

我最近开始将我的应用程序 JDK 版本从 jdk1.7.0_121_x64 升级到 jdk1.8.0_202_x64。我有一些使用 Drools 5.4.0.Final 的遗留代码。此代码适用于 JDK 版本 jdk1.7.0_121_x64,没有任何问题。

Maven 依赖项是:

<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-core</artifactId>
    <version>5.4.0.Final</version>
</dependency>
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-decisiontables</artifactId>
    <version>5.4.0.Final</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

DRL 文件加载为:

final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(resource, ResourceType.DRL);
knowledgeBase.addKnowledgePackages(kbuilder.getKnowledgePackages());
Run Code Online (Sandbox Code Playgroud)

我知道在 JDK 8 中使用 Drools 存在问题。我参考了其他SO 线程开始。


当我构建我的应用程序并使用 JDK 8 执行 Junit 测试时,测试失败并出现错误:

testRunRule(com.company.app.RuleTest)  Time elapsed: 0.073 sec  <<< ERROR!
java.lang.RuntimeException: java.lang.RuntimeException: wrong class format
    at org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader.<init>(ClassFileReader.java:372)
    at org.drools.commons.jci.compilers.EclipseJavaCompiler$2.createNameEnvironmentAnswer(EclipseJavaCompiler.java:287)
    at org.drools.commons.jci.compilers.EclipseJavaCompiler$2.findType(EclipseJavaCompiler.java:258)
Run Code Online (Sandbox Code Playgroud)

正如SO 线程中提到的,我找到了对这个错误修复票DROOLS-329 的引用。


基于此错误修复票中提到的方法,我尝试使用 …

java junit drools maven java-8

24
推荐指数
1
解决办法
536
查看次数

我可以不映射/ flatMap一个OptionalInt吗?

为什么OptionalInt或其他原始可选风格似乎没有map()/ flatMap()方法?

stream()地图操作允许对象和基本类型之间的转换.但为什么Optional不利用这个呢?

OptionalInt profileId = OptionalInt.of(124);

Optional<Profile> profile = profileId.map(i -> getProfile(i));  //no such valid map() method!
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

23
推荐指数
2
解决办法
2179
查看次数

使用lambdas和泛型时,对方法的引用是不明确的

我在下面的代码中收到错误,我认为不应该存在...使用JDK 8u40编译此代码.

public class Ambiguous {
    public static void main(String[] args) {
        consumerIntFunctionTest(data -> {
            Arrays.sort(data);
        }, int[]::new);

        consumerIntFunctionTest(Arrays::sort, int[]::new);
    }

    private static <T> void consumerIntFunctionTest(final Consumer<T> consumer, final IntFunction<T> generator) {

    }

    private static <T> void consumerIntFunctionTest(final Function<T, ?> consumer, final IntFunction<T> generator) {

    }
}
Run Code Online (Sandbox Code Playgroud)

错误如下:

错误:(17,9)java:对consumerIntFunctionTest的引用与net.tuis.ubench.Ambiguous中的方法consumerIntFunctionTest(java.util.function.Consumer,java.util.function.IntFunction)和方法consumerIntFunctionTest(java.util.)都不明确. net.tuis.ubench.Ambiguous匹配中的function.Function,java.util.function.IntFunction)

错误发生在以下行:

consumerIntFunctionTest(Arrays::sort, int[]::new);
Run Code Online (Sandbox Code Playgroud)

我相信应该没有错误,因为所有Arrays::sort引用都是类型的void,并且它们都没有返回值.正如您所看到的,当我明确扩展lambda 时它确实有效Consumer<T>.

这真的是javac中的错误,还是JLS声明lambda在这种情况下无法自动扩展?如果是后者,我仍然认为这很奇怪,consumerIntFunctionTest因为第一个参数Function<T, ?>不应该匹配.

java lambda java-8

23
推荐指数
1
解决办法
2200
查看次数

旧的JaxB和JDK8 Metaspace OutOfMemory问题

我们正在开发自10年以来开发的业务应用程序(100万+ LOC).在切换到JDK8时,我们遇到了JDK8的元空间问题.这似乎与com.sun.xml.ws:webservices-rt:1.4(Metro 1.4)中引用的JaxB-Version有关.由于应用程序中的密切链接以及通过JaxB创建类/实例的传统,因此动态切换旧库并不简单.

目前我们正在研究这个问题.我们创建了一个重现此行为的示例程序:

import java.io.ByteArrayInputStream;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class X
{
  private static final String XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><x test=\"test\" />";

  @XmlAttribute
  String test;

  public static void main( String[] args ) throws JAXBException, InterruptedException
  {
    System.out.println("start");

    while ( true )
    {
      JAXBContext jc = JAXBContext.newInstance( X.class );
      Unmarshaller unmarshaller = jc.createUnmarshaller();
      X object = (X) unmarshaller.unmarshal( new ByteArrayInputStream( XML.getBytes() ) );
      System.out.println( object.test );
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

JDK7使PermGenSpace保持干净.(用16M PermGen模拟) …

java java-metro-framework jaxb out-of-memory java-8

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