标签: java-8

java.util.Set是参数化类型检查失败

我有以下代码.在运行时typeClasszjava.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 java-8

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

使用java8流读入1个文件,并根据一些critera写出3个文件

要清楚 - 这里的目标是使用输入和输出流,这样我以后就不会为输出构建大量列表.我只是想让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)

java stream java-8

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

lambda表达式中的返回类型错误:谓词<T>无法转换为Criteria <T>

我有以下接口和类:

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())上遇到了编译错误.

我该如何解决这个问题?

谢谢.

java java-8 java-stream

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

当ECJ没有时,为什么javac需要引用类的接口?

在编译a时Client,它使用一些接口I(例如O)的实现,类文件I也必须存在于类路径中.奇怪的是,这只是一个例子javac,因为Eclipse编译器(ECJ)不需要I编译.

是什么让JDK 需要超类型进行编译,ECJ编译得很好?

它不是默认方法,如错误报告中所评论的那样,兼容性指南也同意:

在针对另一个实现在另一个类文件中定义的接口的类编译类时,这样的类文件(其中定义了接口)必须在编译期间由javac使用的类路径中可用.这是JDK 8的新要求 - 如果不这样做将导致编译错误.


更新:

  • 类似的问题:Java 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)

java javac java-8 ecj

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

按项目名称长度排序列表的最佳方法

哪种方式最好,看速度和舒适度?

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)

java performance list java-8

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

AssertJ:调用提取后的FlatMap列表

所以我有一个字符串/字符串列表对,我想要做的是提取后,将返回的列表合并到一个列表中,我可以执行更多的断言:

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来收集结果但是我想将断言保持为一个(例如,一些映射断言然后链接一些断言的内容)

java java-8 assertj

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

为什么这些代码在Java 7而不是Java 8中有效?

我目前正在使用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版本有关?

java eclipse java-8

2
推荐指数
3
解决办法
176
查看次数

为什么Stream API中没有flatten()方法?

以下两个代码段产生相同的结果.

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呢?

java-8 java-stream

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

如何创建一个HashMap来迭代lambda函数?

有没有办法在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)

java lambda java-8

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

比较没有NPE的两个空对象的值

这是一个非常基本的问题,但为什么以下代码返回空指针异常?

String a = null;
String b = null;

System.out.println(a.equals(b));
Run Code Online (Sandbox Code Playgroud)

根据这里的文件:

http://docs.oracle.com/javase/7/docs/api/java/util/Objects.html#equals(java.lang.Object,%20java.lang.Object)

.equals()函数在比较值之前首先检查null.它不应该返回true,因为它们都是null吗?

java nullpointerexception java-8

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