我有以下代码.在运行时typeClassz是java.util.Set.但是ParameterizedType的typeClassz实例的计算结果为false.因为java.util.Set它转到了else子句.有任何想法吗 ?
final Type typeClassz = methods.get(index).getParameterTypes()[0];
if(typeClassz instanceof ParameterizedType){
final ParameterizedType classType = (ParameterizedType) ((ParameterizedType) typeClassz).getActualTypeArguments()[0];
return mongoTemplate.findOne(query, (Class<?>) classType.getRawType());
}else{
return mongoTemplate.findOne(query, (Class<?>) typeClassz);
}
Run Code Online (Sandbox Code Playgroud) 要清楚 - 这里的目标是使用输入和输出流,这样我以后就不会为输出构建大量列表.我只是想让java打开输入文件,并运行它,在半实时写入输出文件.
我对溪流来说是全新的.我理解了stream和lamba等的基本思想,但是不知道实现和语法的细节等等(例如,我在一些例子中看到的::语法让我感到困惑)...
在任何情况下 - 下面是一个基本完成我要做的事情的例子......
我想知道如何使用流接口,以便主文件(可能非常大)不需要同时在内存中.
谢谢!
Set<String> set1 = fileToSet(file1);
Set<String> set2 = fileToSet(file2);
List<String> output1 = new ArrayList<>();
List<String> output2 = new ArrayList<>();
List<String> output3 = new ArrayList<>();
for (String line : Files.readAllLines(inputPath)) {
String subString = line.substring(0,10);
if (set1.contains(subString)) {
output1.add(line);
}
else if (set2.contains(subString)) {
output2.add(line);
}
else {
output3.add(line);
}
}
//write out all 3 files from the collected lists
Run Code Online (Sandbox Code Playgroud) 我有以下接口和类:
public interface Rule<T> {
Predicate<T> evaluate();
}
public interface Criteria<T> {
Predicate<T> evaluate();
}
public abstract class AbstractRule<T> implements Rule<T> {
...
Set<Criteria<T>> criteria;
...
@Override
@Nullable
public Predicate<T> evaluate() {
return criteria.stream().reduce((c1, c2) -> c1.evaluate().and(c2.evaluvate()))
.orElse(null);
}
}
Run Code Online (Sandbox Code Playgroud)
AbstractRule类包含一组Criteria.我想通过评估每个标准来对规则进行评估.我在标题中提到的c1.evaluate().和(c2.evaluate())上遇到了编译错误.
我该如何解决这个问题?
谢谢.
在编译a时Client,它使用一些接口I(例如O)的实现,类文件I也必须存在于类路径中.奇怪的是,这只是一个例子javac,因为Eclipse编译器(ECJ)不需要I编译.
是什么让JDK 需要超类型进行编译,ECJ编译得很好?
它不是默认方法,如错误报告中所评论的那样,兼容性指南也同意:
在针对另一个实现在另一个类文件中定义的接口的类编译类时,这样的类文件(其中定义了接口)必须在编译期间由javac使用的类路径中可用.这是JDK 8的新要求 - 如果不这样做将导致编译错误.
更新:
I.doit()是default简单的抽象方法都没关系,行为是一样的I.doit()被覆盖,当然都很重要O; 如果没有覆盖,那么ECJ也会达到I定义doit()接口(api/a/I.java):
package a;
public interface I {
default void doit() {
System.out.println("In I");
}
}
Run Code Online (Sandbox Code Playgroud)
实施(impl/b/O.java):
package b;
public class O implements a.I {
public void doit() {
System.out.println("In O"); …Run Code Online (Sandbox Code Playgroud) 哪种方式最好,看速度和舒适度?
names.sort( (a,b) -> a.getName().length() - b.getName().length() );
Collections.sort(names, Comparator.comparing( s -> Celebrity.getName().length() ))
BiFunction<Celebrity,Celebrity,Integer> bifunc = (a,b) -> Integer.compare(a.getName().length(), b.getName().length());
Collections.sort( names, bifunc::apply );
Run Code Online (Sandbox Code Playgroud) 所以我有一个字符串/字符串列表对,我想要做的是提取后,将返回的列表合并到一个列表中,我可以执行更多的断言:
MyTest.java
Map<String, List<String>> testMap = new HashMap<>();
List<String> nameList = newArrayList("Dave", "Jeff");
List<String> jobList = newArrayList("Plumber", "Builder");
List<String> cityList = newArrayList("Dover", "Boston");
testMap.put("name", nameList);
testMap.put("job", jobList);
testMap.put("city", cityList);
assertThat(testMap).hasSize(3)
.extracting("name", "city")
//not sure where to go from here to flatten list of lists
// I want to do something like .flatMap().contains(expectedValuesList)
Run Code Online (Sandbox Code Playgroud)
当我调用extract时,它会将列表值拉出到列表列表中,这很好,但是之后我不能调用flatExtracting,因为没有要传入的属性名称,而且从我看过的内容看起来似乎并不好像自定义提取器是合适的(否则我不完全确定如何把它放在一起).有没有另一种方法可以平息我回来的列表清单?我可以去一个稍长的路径并在列表列表上做断言,或者在断言之前使用lambda来收集结果但是我想将断言保持为一个(例如,一些映射断言然后链接一些断言的内容)
我目前正在使用IDE Eclipse版本:Neon.2发行版(4.6.2)和版本java版本8更新131.在此代码中,IDE发出错误 - "类型不匹配:无法从字节转换为整数":
Integer i = (byte) 10;
Run Code Online (Sandbox Code Playgroud)
但是这个代码在IDE Eclipse Version:Indigo Service Release 2和java Version 7中正确执行.在第8版java的扩展转换机制中有什么实质性的改变,因为我不认为它与IDE版本有关?
以下两个代码段产生相同的结果.
用flatMap:
Stream.iterate(2, n -> n + 4)
.flatMap(n -> Stream.of(n, -(n + 2)));
Run Code Online (Sandbox Code Playgroud)
随着map其次是flatMap使用identity:
Stream.iterate(2, n -> n + 4)
.map(n -> Stream.of(n, -(n + 2)))
.flatMap(Function.identity());
Run Code Online (Sandbox Code Playgroud)
因此flatten,在Stream接口中包含无参数方法(如Scala的Stream)似乎很自然,允许将前面的示例写成:
Stream.iterate(2, n -> n + 4)
.map(n -> Stream.of(n, -(n + 2)))
.flatten();
Run Code Online (Sandbox Code Playgroud)
那么为什么API中没有flatten()方法Stream呢?
有没有办法在lambda函数内创建这个hashmap?
Map<SaleStatus, Long> sales = new HashMap<>();
saleStatusCounters.forEach(saleStatusCounter -> sales.put(saleStatusCounter.getStatus(), saleStatusCounter.getMatches()));
Run Code Online (Sandbox Code Playgroud)
像这样的东西:
saleStatusCounters.stream()
.map(obj -> new HashMap<SaleStatus, Long>().put(obj.getStatus(), obj.getMatches()))
.collect(Collectors.toMap(???)));
Run Code Online (Sandbox Code Playgroud) 这是一个非常基本的问题,但为什么以下代码返回空指针异常?
String a = null;
String b = null;
System.out.println(a.equals(b));
Run Code Online (Sandbox Code Playgroud)
根据这里的文件:
该.equals()函数在比较值之前首先检查null.它不应该返回true,因为它们都是null吗?