标签: java-8

Java 8传递方法作为参数

目前正在进入Java 8 lambda表达式和方法引用.

我想传递一个没有args且没有返回值的方法作为另一个方法的参数.这就是我这样做的方式:

public void one() {
    System.out.println("one()");
}

public void pass() {
    run(this::one);
}

public void run(final Function function) {
    function.call();
}

@FunctionalInterface
interface Function {
    void call();
}
Run Code Online (Sandbox Code Playgroud)

我知道有一组预定义功能接口在java.util.function诸如Function<T,R>,但我没有找到一个不带任何参数,而不是产生结果.

java lambda java-8 method-reference

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

Java 8中"功能接口"的精确定义

最近我开始探索Java 8,我无法理解Java功能实现lambda表达式所必需的"功能接口"的概念.有一个非常全面的 Java函数中的lambda函数指南,但我仍然坚持用于定义函数接口概念的章节.定义如下:

更确切地说,功能接口被定义为具有恰好一个抽象方法的任何接口.

然后他进入示例,其中一个是Comparator界面:

public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
} 
Run Code Online (Sandbox Code Playgroud)

我能够测试我可以使用lambda函数代替Comparator参数,它可以工作(即Collections.sort(list, (a, b) -> a-b)).

但是在Comparator接口中,两者compareequals方法都是抽象的,这意味着它有两个抽象方法.那么如果定义要求接口只有一个抽象方法,那么它如何工作呢?我在这里错过了什么?

lambda abstract java-8 functional-interface

66
推荐指数
2
解决办法
7707
查看次数

默认方法返回true一段时间,然后返回false?(可能的JVM错误)

我有一个问题,下面的代码,我隔离到最封闭的形式,我使用Java 8,几乎准备好发布(2014年3月18日),所以我希望在实现本身没有严重的问题,所以它可能/必须是我自己的代码:

注意:代码是用Java 8编写的,它具有各种新功能,包括default接口中的方法实现.

public abstract class Drawable implements DrawableInterface {    

}
Run Code Online (Sandbox Code Playgroud)
interface DrawableInterface {
    default public boolean isShadowReceiver() {
        return false;
    }

    default public boolean isShadowCaster() {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)
public interface ShadowDrawable extends DrawableInterface {
    @Override
    default public boolean isShadowReceiver() {
        return true;
    }

    @Override
    default public boolean isShadowCaster() {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)
public class Box extends Drawable implements ShadowDrawable {

}
Run Code Online (Sandbox Code Playgroud)
public class IsolatedBug {
    private final Box box;

    private final List<Drawable> drawables; …
Run Code Online (Sandbox Code Playgroud)

java inheritance interface java-8

66
推荐指数
1
解决办法
2816
查看次数

Java8 Lambdas和Exceptions

我想知道是否有人可以向我解释以下奇怪之处.我正在使用Java 8更新11.

鉴于这种方法

private <F,T> T runFun(Function<Optional<F>, T> fun, Optional<F> opt) {
   return fun.apply(opt) ;
}
Run Code Online (Sandbox Code Playgroud)

如果我首先构造一个函数Object,并将其传递给上面的方法,那么事情就会编译.

private void doesCompile() {
    Function<Optional<String>, String> fun = o -> o.orElseThrow(() -> new RuntimeException("nah"));
    runFun(fun, Optional.of("foo"));

}
Run Code Online (Sandbox Code Playgroud)

但是,如果我将函数内联为lambda,编译器会说

未报告的例外X; 必须被抓住或宣布被抛出

private void doesNotCompile () {
    runFun(o -> o.orElseThrow(() -> new RuntimeException("nah")), Optional.of("foo"));
}
Run Code Online (Sandbox Code Playgroud)

更新:原来错误消息由maven缩写.如果直接用javac编译,则错误是:

error: unreported exception X; must be caught or declared to be thrown
            runFun(o -> o.orElseThrow(() -> new RuntimeException("nah")), Optional.of("foo"));
                                     ^
  where X,T are type-variables:
    X extends Throwable declared …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

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

在Spring MVC中使用ScrollableResults支持的Stream作为返回类型时遇到问题


重要说明:这已被接受为具有4.1.2的目标修订版本的Spring问题.


我的目标是在从Hibernate生成HTTP响应时实现O(1)空间复杂度ScrollableResults.我想保留MessageConverter调度a的标准机制来处理从a返回的对象@Controller.我已经设置了以下内容:

  1. MappingJackson2HttpMessageConverter丰富了JsonSerializer处理Java 8的a Stream;
  2. 定制ScrollableResultSpliterator包装需要ScrollableResultsStream;
  3. OpenSessionInViewInterceptor需要保持Hibernate会话在MessageConverter;
  4. 设置hibernate.connection.release_modeON_CLOSE;
  5. 确保JDBC连接具有必要的ResultSet可保持性:con.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT).

另外,我需要一个支持这种可保持性的数据库.PostgreSQL就是这样一个数据库,我对此没有任何麻烦.

我遇到的最后一个绊脚石是HibernateTransactionManager事务提交所使用的策略:除非底层会话是"Hibernate管理的",否则它会disconnect()关闭我的光标以及其他所有内容.这样的策略在某些特殊情况下很有用,特别是"会话范围会话",这些会议远离我的要求.

我设法用一个糟糕的黑客解决这个问题:我不得不用一种方法来覆盖有问题的方法,该方法实际上是原始的复制粘贴,除了被移除的disconnect()调用,但它必须求助于反射来访问私有API.

public class NoDisconnectHibernateTransactionManager extends HibernateTransactionManager
{
  private static final Logger logger = LoggerFactory.getLogger(NoDisconnectHibernateTransactionManager.class);

  public NoDisconnectHibernateTransactionManager(SessionFactory sf) { super(sf); }

  @Override
  protected void doCleanupAfterCompletion(Object transaction) {
    final JdbcTransactionObjectSupport txObject = (JdbcTransactionObjectSupport) transaction;
    final Class<?> c = …
Run Code Online (Sandbox Code Playgroud)

java hibernate open-session-in-view spring-orm java-8

66
推荐指数
1
解决办法
1801
查看次数

JDK8 - 尝试使用Maven javadoc插件生成javadoc时出现错误"找不到javax.interceptor.InterceptorBinding的类文件"

我正在使用JDK8(在Jenkins推出的Linux上使用Win x64 u25 JDK +在我的Eclipse工作区上尝试过它 - jdk-8u20-linux-x64,两者都有同样的问题).

我有多模块Maven项目(我从包装类型为"pom"的主模块启动Maven目标"javadoc:aggregate").

Pom构建部分如下所示:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <configuration>
                <additionalparam>-Xdoclint:none</additionalparam>
            </configuration>
        </plugin>
    </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)

我总是收到错误:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.10.1:aggregate (default-cli) on project uloan-global-build: An error has occurred in JavaDocs report generation:
[ERROR] Exit code: 1 - javadoc: error - com.sun.tools.doclets.internal.toolkit.util.DocletAbortException: com.sun.tools.doclets.internal.toolkit.util.DocletAbortException: com.sun.tools.doclets.internal.toolkit.util.DocletAbortException: com.sun.tools.javac.code.Symbol$CompletionFailure: class file for javax.interceptor.InterceptorBinding not found
[ERROR] 
[ERROR] Command line was: /usr/java/jdk1.8.0_20/jre/../bin/javadoc @options @packages
Run Code Online (Sandbox Code Playgroud)

我已尽力尝试一切,并试图在Google上搜索很长时间,但没有成功.我找到了人们遇到类似问题的链接,但没有任何关于可能的解决方案的信息:

http://marc.info/?l=maven-user&m=139615350913286&w=2

http://mail-archives.apache.org/mod_mbox/maven-users/201409.mbox/%3C54101E24.6060304@gmx.de%3E(建议将JDK8更新为>更新20,我做了,但问题仍然存在相同).

任何提示或任何人都经历过这种行为(不幸的是,由于某种原因,它看起来非常"罕见")?非常绝望...

java maven maven-javadoc-plugin java-8

66
推荐指数
5
解决办法
3万
查看次数

在java 8中按多个字段名分组

我找到了通过POJO中的某个字段名称对对象进行分组的代码.以下是代码:

public class Temp {

    static class Person {

        private String name;
        private int age;
        private long salary;

        Person(String name, int age, long salary) {

            this.name = name;
            this.age = age;
            this.salary = salary;
        }

        @Override
        public String toString() {
            return String.format("Person{name='%s', age=%d, salary=%d}", name, age, salary);
        }
    }

    public static void main(String[] args) {
        Stream<Person> people = Stream.of(new Person("Paul", 24, 20000),
                new Person("Mark", 30, 30000),
                new Person("Will", 28, 28000),
                new Person("William", 28, 28000));
        Map<Integer, List<Person>> peopleByAge;
        peopleByAge = people …
Run Code Online (Sandbox Code Playgroud)

java java-8

66
推荐指数
6
解决办法
9万
查看次数

Java 8:计算lambda迭代的首选方法?

我经常遇到同样的问题.我需要计算一个lambda的运行,以便在lambda之外使用.例如:

myStream.stream().filter(...).forEach(item->{ ... ; runCount++);
System.out.println("The lambda ran "+runCount+"times");
Run Code Online (Sandbox Code Playgroud)

问题是runCount需要是final,所以它不能是int.它不能是一个整数,因为那是不可变的.我可以使它成为类级变量(即一个字段),但我只需要在这个代码块中.我知道有各种各样的方式,我只是好奇你最喜欢的解决方案是什么?您使用AtomicInteger或数组引用还是其他方式?

java lambda java-8 java-stream

66
推荐指数
7
解决办法
6万
查看次数

Java 8 lambda从列表中获取和删除元素

鉴于元素的列表,我想用一个给定的属性来获取元素,并从列表中删除.我找到的最佳解决方案是:

ProducerDTO p = producersProcedureActive
                .stream()
                .filter(producer -> producer.getPod().equals(pod))
                .findFirst()
                .get();
producersProcedureActive.remove(p);
Run Code Online (Sandbox Code Playgroud)

是否可以在lambda表达式中组合get和remove?

java lambda java-8 java-stream

65
推荐指数
6
解决办法
10万
查看次数

Java流toArray()转换为特定类型的数组

也许这很简单,但我实际上是Java 8功能的菜鸟,不知道如何实现这一点.我有这个简单的行包含以下文本:

"钥匙,名字"

我想将该行转换为String数组,用逗号(,)分隔每个值,但是,我还希望在返回最终数组之前修剪每个字段,因此我执行了以下操作:

Arrays.stream(line.split(",")).map(String::trim).toArray();
Run Code Online (Sandbox Code Playgroud)

但是,这会返回Object []数组而不是String []数组.经过进一步检查,我可以确认内容实际上是String实例,但数组本身是Object元素.让我来说明一下,这是调试器对返回对象的说法:

Object[]:
    0 = (String) "Key"
    1 = (String) "Name"
Run Code Online (Sandbox Code Playgroud)

据我所知,问题出在map调用的返回类型中,但是如何让它返回一个String []数组呢?

java arrays java-8 java-stream

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