对于设置,我有:
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的私有成员字段.
那他们为什么要回归两件不同的东西呢?
根据:
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)"
我想以数据表的形式存储数据,如下所示:
+--------+-------+-----+-----+
| | 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) 如果我正在编写一个过滤函数,我依赖于我的过滤器的外部变量.例如:
public List<String> getMatches(String search) {
return stringList.stream().filter(str -> str.contains(search)).collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)
此过滤器取决于外部参数.我只是想知道如果你事先不知道标准,如何使用纯函数编写过滤器.
我们的项目中有以下代码,虽然它工作正常但随机我们在运行时得到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) 我想知道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
我正在尝试将我的"长"代码转换为更简单的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 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) 我正在写一个片段:
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()方法.
在我们的项目中,我们正在从WebSphere 7(Java 6)迁移到8.5.5.9(Java 8).我们选择了这个精确版本,因为它支持Java 8.
不知何故,我们只使用SDK 1.6安装了8.5.5.9.
除了默认的WAS 8.5.5.9设置之外,是否还有与IBM Installation Manager一起安装的特殊修补程序?
提前致谢.
java-8 ×10
java ×9
java-stream ×4
lambda ×4
datatable ×1
generic-list ×1
generics ×1
list ×1
store ×1
string ×1
websphere ×1
websphere-8 ×1