标签: java-8

通用参数返回流中的List <ChildInterface>,但是直接方法调用返回List <Parent>

对于设置,我有:

interface Parent

interface Child1 extends Parent

interface Child2 extends Parent
Run Code Online (Sandbox Code Playgroud)

我在其他地方:

public class MyClass {
    private List<Child1> child1List = new ArrayList<>();

    public List<Parent> getChild1List(Contact contact) {
        return child1List.parallelStream()
                         .filter(m -> m.getContacts().contains(contact))
                         .sorted(Comparator.comparing(Parent::getParentField))
                         .collect(Collectors.toList());
    }
}
Run Code Online (Sandbox Code Playgroud)

当我这样做时,getChild1List返回一个List<Parent>(不应该返回List<Child1>吗?)

后来,我发现该流对其他方法很有用,所以我提取它并用它构建了一个泛型方法.我有多个扩展Parent的接口,所以我做了如下:

    private <T extends Parent> List<T> returnsListByContact(List<T> childList, Contact contact) {
        return childList.parallelStream()
                        .filter(m -> m.getContacts().contains(contact))
                        .sorted(Comparator.comparing(Parent::getParentField))
                        .collect(Collectors.toList());
    }
Run Code Online (Sandbox Code Playgroud)

getChild1List(Contact contact)成为:

    public List<Parent> getChild1List(Contact contact) {
        return returnsListByContact(child1List, contact);
    }
Run Code Online (Sandbox Code Playgroud)

但是现在它不喜欢这个,引用getChild1List返回一个List<Child1>.我不明白为什么,因为流的实现根本没有改变 - 除了启动它的childList来自通用参数,而不是直接调用MyClass的私有成员字段.

那他们为什么要回归两件不同的东西呢?

generics lambda list generic-list java-8

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

可以使用方法引用来访问静态方法吗?

根据:

https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html

看起来它是可能的,但是尝试真正返回编译错误.由于我们无法使用静态方法实现接口,因此它更有意义.

public class SomeClass {

    static public boolean getB(){
        return false;
    }
}

List<SomeClass> list = new ArrayList<>();       
list.add(new SomeClass());

// below causes compile error, which I expect, however documentation indicates oherwise
list.stream().filter(SomeClass::getB).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

这是编译错误:

"此行的多个标记 - 应该以静态方式访问SomeClass类型的方法getB() - Stream类型中的方法过滤器(Predicate)不适用于参数(SomeClass :: getB)"

java java-8 java-stream method-reference

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

Java 8:以数据表的形式存储和检索数据

我想以数据表的形式存储数据,如下所示:

+--------+-------+-----+-----+
|        |   s1  |  s2 |  s3 |
+--------+-------+-----+-----+
|   c1   |   5   |  7  |  7  |
+--------+-------+-----+-----+
|   c2   |   1   |  6  |  9  |
+--------+-------+-----+-----+
|   c3   |   0   |  9  |  6  |
+--------+-------+-----+-----+
Run Code Online (Sandbox Code Playgroud)

在java中存储它的好方法是什么,这样我就可以通过它们的密钥来检索数据.

我需要一个看起来像这样的方法:

public int getData(String row, String column);

// Example:
int i = getData("c1", "s1") // Would return 5
Run Code Online (Sandbox Code Playgroud)

java datatable store java-8

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

使用Java 8的Stream API,如何编写纯粹的过滤函数?

如果我正在编写一个过滤函数,我依赖于我的过滤器的外部变量.例如:

public List<String> getMatches(String search) {
    return stringList.stream().filter(str -> str.contains(search)).collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

此过滤器取决于外部参数.我只是想知道如果你事先不知道标准,如何使用纯函数编写过滤器.

java functional-programming java-8 java-stream

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

Java 8 lambda - 运行时错误

我们的项目中有以下代码,虽然它工作正常但随机我们在运行时得到class def not found错误.我们的App服务器在每个星期日重新启动,因此有时我们会在任何随机服务器实例上收到此错误.服务器重启解决了问题,但任何线索都是为什么类加载中断.

我在这个问题上有一些类似的错误,似乎问题已在jdk 9中修复了.JR8中的lambdas转换

但在我得出结论之前,有人可以解释它是同一种错误,以及为什么偶尔会发生这种错误.

public boolean isAttachmentExpired(final Document_Attachment da) {
    return this.bcDocumentScreen.getValidator().getAttachmentsValidator().isAttachmentExpired(da);
}

public boolean isAttachmentWarningShown() {
    return CollectionUtils.isNotEmpty(getAttachments()) && getAttachments().stream().anyMatch(this::isAttachmentExpired);
}

public boolean isAttachmentExpired(final Document_Attachment da) {
        final Date today = DateHelper.today();
        return DateHelper.diffInYears(today, da.getUploaded()) >= 1;
    }
Run Code Online (Sandbox Code Playgroud)

错误:-

Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.GeneratedMethodAccessor1913.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.jboss.seam.util.Reflections.invoke(Reflections.java:22)
        at org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:32)
        at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56)
        at org.jboss.seam.core.BijectionInterceptor.aroundInvoke(BijectionInterceptor.java:79)
        at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
        at org.jboss.seam.persistence.ManagedEntityInterceptor.aroundInvoke(ManagedEntityInterceptor.java:48)
        at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
        at org.jboss.seam.transaction.RollbackInterceptor.aroundInvoke(RollbackInterceptor.java:28)
        at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
        at org.jboss.seam.core.MethodContextInterceptor.aroundInvoke(MethodContextInterceptor.java:44)
        at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
        at org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:107)
        at org.jboss.seam.intercept.JavaBeanInterceptor.interceptInvocation(JavaBeanInterceptor.java:196) …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

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

Java 8流的toArray和size参数

我想知道stream().toArray [x - > new Integer [x]]如何知道来自哪个数组的大小?我写了一个片段,其中我创建了一个大小为4的整数列表并过滤了值,并创建了一个长度为过滤流的数组,我无法看到任何方法来获取流的大小.

List<Integer> intList = new ArrayList<Integer>();
intList.add(1);
intList.add(2);
intList.add(3);
intList.add(4);


    Integer[] array = intList.stream()
                             .filter(x -> x > 2)
                             .toArray(x -> {
                                System.out.println("x --> " + x);
                                return new Integer[x];
                              });

System.out.println("array length: " + array.length);
Run Code Online (Sandbox Code Playgroud)

上述代码的输出:

x --> 2
array length: 2
Run Code Online (Sandbox Code Playgroud)

最初,片段就像

Integer[] array = intList.stream()
                 .filter(x -> x > 2)
                 .toArray(x -> new Integer[x]);
Run Code Online (Sandbox Code Playgroud)

只是为了理解它传递的x的值,我必须改变它以在lambda中打印x

java lambda java-8 java-stream

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

将代码转换为lambda

我正在尝试将我的"长"代码转换为更简单的lambda驱动代码.想法是从枚举中获取价值.如果第一个值更高或更低,则将其返回并将lambda从进一步打破.我不知道从哪里开始.Lambda从枚举中返回代码,它可以很好地计算差异.我的问题是,一旦发现差异,就会获得返回和/或破坏lambda的值.

代码不起作用:

BiFunction<Map<String, Integer>,Map<String, Integer>,Integer> biFunction = (m1, m2) -> {
    enumWords.forEach(word -> {
        Integer returnValue = 0;
        if(m1.get(word) > m2.get(word)){
            returnValue = m1.get(word).compareTo(m2.get(word));
            break;
        }
    });
    return returnValue;     
};
Run Code Online (Sandbox Code Playgroud)

这是有效的代码(pre-lambda):

BiFunction<Map<String, Integer>,Map<String, Integer>,Integer> biFunction = (m1, m2) -> {
            Integer returnValue = 0;
            if(m1.get("Love") > m2.get("Love")){
                returnValue = -1;
            }else if(m1.get("Love") < m2.get("Love")){
                returnValue = 1;
            }else{
                if(m1.get("You") > m2.get("You")){
                    returnValue = -1;
                }else if(m1.get("You") < m2.get("You")){
                    returnValue = 1;
                }else{
                    if(m1.get("Me") > m2.get("Me")){
                        returnValue = -1;
                    }else if(m1.get("Me") …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

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

Java 8替代字符串中奇数位置的字符总和?

很想知道是否有更优雅的方法试图在Java 8中找到字符串中奇数位置的数字总和.

这是我目前的职能

 /**
 * Explode string into char array, get sum of ASCII values at odd positions and divide by 10 to convert
 * to the integer value from that character
 * @param ccNumber string
 * @return int sum
 */
int calculateSumOfOddDigits(final String ccNumber) {
    final char[] digits = ccNumber.toCharArray();
    return (digits[0] + digits[2] + digits[4] + digits[6] + digits[8] + digits[10] + digits[12] + digits[14]) / 10;
}
Run Code Online (Sandbox Code Playgroud)

还不熟悉Streams和Java 8,想想也许你可以这样做:

 ccNumber.chars().mapToObj(x -> (char) x {
        ..add odd position …
Run Code Online (Sandbox Code Playgroud)

java string java-8 java-stream

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

forEach()方法如何在Java 8中工作

我正在写一个片段:

List<Integer> list=Arrays.toList(2,4,6,8);
list.forEach(i -> System.out.println(i));
Run Code Online (Sandbox Code Playgroud)

请在上面的代码片段中解释一下方法调用的流程.forEach()方法如何将参数传递给accept()方法?forEach()方法每次都调用accept方法吗?如果我错了,请纠正我.

i-> System.out.println(i)
Run Code Online (Sandbox Code Playgroud)

返回Consumer接口的对象.forEach()使用i作为参数调用该对象的accept()方法.

java java-8

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

WebSphere 8.5.5.9未随SDK 8一起提供

在我们的项目中,我们正在从WebSphere 7(Java 6)迁移到8.5.5.9(Java 8).我们选择了这个精确版本,因为它支持Java 8.

不知何故,我们只使用SDK 1.6安装了8.5.5.9.

安装了jdk 8,但WAS支持最多java 6

除了默认的WAS 8.5.5.9设置之外,是否还有与IBM Installation Manager一起安装的特殊修补程序?

提前致谢.

java websphere java-8 websphere-8

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