小编shm*_*sel的帖子

具有较低有界类型的Java类型推断

为什么Java可以推断多个上限类型的共同祖先,而不是下限类型的共同祖先?

更具体地说,请考虑以下示例:

static class Test {

    static <T> T pick(T one, T two) {
        return two;
    }

    static void testUpperBound() {
        List<? extends Integer> extendsInteger = new ArrayList<>();

        // List<? extends Integer> is treated as a subclass of List<? extends Number>
        List<? extends Number> extendsNumber = extendsInteger;

        // List<? extends Number> is inferred as the common superclass
        extendsNumber = pick(extendsInteger, extendsNumber);
    }

    static void testLowerBound() {
        List<? super Number> superNumber = new ArrayList<>();

        // List<? super Number> is treated as …
Run Code Online (Sandbox Code Playgroud)

java generics type-inference bounded-wildcard

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

对结果末尾全 0 的数字列表进行排序

我有人员名单,如果输入列表是3,0,2,7,0,8

我想要的输出是2,3,7,8,0,0

使用以下代码,我可以仅对非零数字进行排序以获取2,3,7,8输出。

sortedList = personList.stream()
                       .filter(Person -> Person.getAge()>0)
                       .sorted(Comparator.comparingInt(Person::getAge))
                       .collect(Collectors.toList());

zeroList=personList.stream()
                       .filter(Person -> Person.getAge()==0)
                       .collect(Collectors.toList());

sortedList.addAll(zeroList);
Run Code Online (Sandbox Code Playgroud)

上述两个语句可以合并为一个语句吗?

java java-stream

6
推荐指数
2
解决办法
1345
查看次数

如何组合List <Predicate <MyClass >>中的所有谓词

我有一个问题,我相信你帮我解决了皱纹问题.

我有

List<Predicate<TaskFx>> predicates
Run Code Online (Sandbox Code Playgroud)

我想在这里使用这些谓词

taskFxList.stream().filter(predicates).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

作为一个谓词合并如下:

predicate1.and(predicate2).and...
Run Code Online (Sandbox Code Playgroud)

我有一个表(13列),其中包含一些结果(在JavaFx中)和6个字段,可以通过这些字段中的值在此表中搜索.我只能输入3个字段的值,所以我的

predicates.size() = 3;
Run Code Online (Sandbox Code Playgroud)

问题是如何最好地动态准备一个

Predicate<TaskFx> predicate
Run Code Online (Sandbox Code Playgroud)

包含由x.and(y).和(z)合并的所有谓词

非常感谢您的帮助!

java predicate java-8 java-stream

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

有没有办法使用java8进一步优化下面的代码?

我在我的项目中遇到了以下代码.我想知道它是否可以进一步优化可能是通过使用java 8流或一般的集合API.

private Set<Student> getFilteredSet() {
    Set<Student> unfilteredSet = getAllStudents();
    Set<Student> adminAreaSet = getAdminStudents();

    Set<String> adminAreaID = new HashSet<>();
    Set<Student> filteredSet = new HashSet<>();

    for (final Student student : adminAreaSet) {
        adminAreaID.add(student.getId());
    }
    for (final Student student : unfilteredSet) {
        if (adminAreaID.contains(student.getId())) {
            filteredSet.add(student);
        }
    }   
    return filteredSet;
}
Run Code Online (Sandbox Code Playgroud)

注意: unfilteredSetadminAreaSet保持不同的子类型Student

java collections optimization java-8 java-stream

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

为什么 Java 中不允许类中的隐式泛型?

我试图理解为什么 Java 不允许像在泛型方法中那样在泛型类中使用隐式类型。

我已经在网上搜索了有关此问题的答案,但还没有找到为什么Java 不支持以下内容的原因:

// This will not compile:
public <T> interface ElementPicker<L extends List<T>> { ... }

// This on the other hand will
public interface ElementPicker<T, L extends List<T>> { ... }
Run Code Online (Sandbox Code Playgroud)

因此我们必须在类泛型参数中明确提及类型 T。这当然意味着我们现在必须总是这样写:

ElementPicker<Integer, List<Integer>>
// instead of just:
ElementPicker<List<Integer>>
Run Code Online (Sandbox Code Playgroud)

这导致我的代码一直头疼,我试图明智地平衡使用泛型,同时使我的类型可读和简短。

不幸的是,在我当前的项目中,我正在处理一堆嵌套的泛型类型,它们的类型参数冒泡到顶部,因此我有很长的顶级类,必须包含所有泛型类型数据。

要了解这如何成为问题,请考虑:

interface ScalarValue<T extends Number> {
  T toNumber();
}

interface ScalarAdder<T, U extends ScalarValue<T>> {
  T add(U v1, U v2);
}

class ScalarAccumulator<T, U extends ScalarValue<T>, 
                           A extends ScalarAdder<T, U>> {
  ... …
Run Code Online (Sandbox Code Playgroud)

java generics

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

拥有仅调用重写的超类方法的子类方法是否有好处?

重构时,我在子类中遇到了以下方法:

public void disposeResultsTable() {
    super.disposeResultsTable();
}
Run Code Online (Sandbox Code Playgroud)

保留此方法而不是简单地允许调用继承的超类方法有什么好处?

java inheritance

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

Java Stream:如何有条件过滤?

我有以下 Java Stream 流语句,并根据 typeId 值过滤记录 types.getIds().contains(x.getType().getId())

return petRepository.findAll().stream()
                .filter(x -> types.getIds().contains(x.getType().getId()))
                .collect(Collectors.groupingBy(x -> x.getType().getName(), Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)

但是,我想在types.getIds().size() == 0尝试以下 shpon 时获取所有值:

.filter(types.getIds().size() > 0 ? x -> types.getIds().contains(x.getType().getId()) : <NO FILTERING>)
Run Code Online (Sandbox Code Playgroud)

那么,我怎样才能跳过过滤呢types.getIds().size() == 0

java lambda functional-programming java-stream

6
推荐指数
2
解决办法
767
查看次数

autobox原始文字是否有性能成本?

说我有以下代码:

Map<String, Boolean> map = ...
map.put("foo", true);
Run Code Online (Sandbox Code Playgroud)

从理论上讲,true必须进行自动装箱,与插入相比会导致轻微的性能损失Boolean.TRUE.但是由于我们正在处理一个文字值,编译器是否有可能用一个盒装文字替换原始文字,因此没有额外的运行时开销?

在任何人攻击我之前,我通常会为了代码清晰度而选择原始文字,即使性能成本很低.这个问题大多是理论上的.

java autoboxing boxing

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

如何在列表的每个元素上调用lambda并将结果放入新列表中?我的工作版本太冗长了

我想在List的每个元素上调用lambda函数,并将结果放在一个新的List中.

我目前的版本是这样的:

b = a.stream().map(i-> i+1).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但它似乎相当冗长,并且通过从列表到流的转换所需的所有样板代码隐藏了代码的意图,反之亦然.其他语言(例如ruby)中的相同代码将更加简洁,如下所示:

b = a.map{|i| i+1}
Run Code Online (Sandbox Code Playgroud)

当然可以做这样的事情:

for (int i: a) {
    b.add(i+1);
}
Run Code Online (Sandbox Code Playgroud)

但它看起来有点过时,而且不如lambda版本灵活.

为了改变现有的List,Holger的评论 list.replaceAll(i->i+1)很好,但我有兴趣创建一个新的List对象.

是否有一种方法可以在列表的每个元素上调用lambda并创建一个带有结果的新元素?

java boilerplate java-8 java-stream

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

Java 8的forEachOrdered()和sequential()方法之间的区别?

我正在研究java 8并行流并且想要在并行流中打印元素是一些顺序(比如插入顺序,逆序或顺序顺序).

为此,我尝试了以下代码:

        System.out.println("With forEachOrdered:");
        listOfIntegers
            .parallelStream()
            .forEachOrdered(e -> System.out.print(e + " "));
        System.out.println("");

        System.out.println("With Sequential:");
        listOfIntegers.parallelStream()
                    .sequential()
                    .forEach(e -> System.out.print(e + " "));
Run Code Online (Sandbox Code Playgroud)

对于这两个,我得到相同的输出如下:

With forEachOrdered:
1 2 3 4 5 6 7 8 
With Sequential:
1 2 3 4 5 6 7 8 
Run Code Online (Sandbox Code Playgroud)

从api文档中,我可以看到:

forEachOrdered - >这是一个终端操作.

顺序 - >这是一个中间操作.

所以我的问题是哪一个更好用?在哪种情况下,一个应该优先于其他情况?

java parallel-processing java-8 java-stream

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