标签: java-8

如何使用stream api将两个过滤器应用于一个列表

我想在列表中添加第二个过滤器,我想排除空字符串旁边的字符串列表中的副本.

以下是我尝试使用流API的方法:

这将区分结果,但不是空的

List<User> users = userService.getUsers(form.getId());
    List<String> positionNames = users.stream().map(User::getTitle).distinct().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我怎样才能将它们组合在一起?

java java-8

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

使用Java 8将两个列表中的对象与唯一ID合并

class Human {
    Long humanId;
    String name;
    Long age;
}


class SuperHuman {
    Long superHumanId;
    Long humanId;
    String name;
    Long age;
}
Run Code Online (Sandbox Code Playgroud)

我有两个清单.人类名单和superHumans名单.我想从两个中创建一个单独的列表,确保如果一个人是超人,它只会在使用java 8的列表中出现一次.有一个巧妙的方法吗?更新:这些是不同的类,即不扩展另一个.我想最终的名单是超人.如果一个人已经是超人,我们就会忽视那个人类的对象.如果人类不是超人,我们将人类对象转换为超人类对象.理想情况下,我希望按照他们的年龄对它们进行排序,以便获得按日期降序排序的超人列表.

java java-8

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

我可以使用setter方法替换最终变量,方法如下

我们大多数人都了解共享可变性的后果,并且据说如果你有机会,总是更喜欢不变性(最终修饰符,设置一次,你不能改变它).我已经看到很少的编码示例,其中People实际上将字段final或setter设置为private或甚至删除类的setter(可以是DTO,Model或Entity类)和另一个类(可以将值设置为不可变的一个构建器类) class)用于创建和设置Immutable类的字段确保没有其他类能够修改状态.这似乎是我的负担.所以我想出了这个想法(下面我举一个例子)

public class TestDataClass {

    private String name;

     public String getName() {
        return name;
    }

    public void setName(Supplier<String> supplier) throws Exception {
        if(Objects.isNull(name))
            this.name = supplier.get();
        throw new Exception("This field is immutable and already has a value "+this.name);
    }
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,你可以通过这样的setter设置值,objectOfTestDataClass.setName(() -> {return Perform_Desired_Logic;}); 或者 objectOfTestDataClass.setName(() ->"My Name");它是普通的setter.然后你也不必创建一个bulder类或使setter私有或省略setter方法

通过这种方式,一旦你将字段设置为Immutable(我不考虑反射),我也可以在实例化期间摆脱变量初始化.

我希望您的专家意见能够验证我的想法是否合法,我可以将其视为不变性吗?我错过了什么吗?在那种情况下,请纠正我.

java java-8

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

如果HashMap具有值,我该如何返回

Map<String, Integer> hm = new HashMap<>();
//assume hm is populated

if(hm.containValue(***){ ... }
// *** = contains even number
Run Code Online (Sandbox Code Playgroud)

我尝试做类似的事情,(x -> x % 2 == 0)但它不起作用.

有什么建议?

java hashmap java-8

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

为什么Combiner不影响输出?

以下代码输出始终为24.

public static void main(String[] args) throws InterruptedException {
    List<String> list = new ArrayList<String>();
    list.add("java");
    list.add("php");
    list.add("python");
    list.add("perl");
    list.add("c");
    list.add("lisp");
    list.add("c#");
    int s = list.stream().reduce(0, (x, y) -> x + y.length(), (x, y) -> 0);
    System.out.println(s);
    s = list.stream().reduce(0, (x, y) -> x + y.length(), (x, y) -> x - y);
    System.out.println(s);
    s = list.stream().reduce(0, (x, y) -> x + y.length(), (x, y) -> x * y);
    System.out.println(s);

}   
Run Code Online (Sandbox Code Playgroud)

问题是组合器影响我的代码的原因.

java java-8 java-stream

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

Joda-Java 8转换时间

如何在Java 8中实现以下功能java.time:

DateTime dt = new DateTime(year, month, date, hours, min, sec, milli);
Run Code Online (Sandbox Code Playgroud)

但我找到了这个选项:

OffsetDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond, offset)
Run Code Online (Sandbox Code Playgroud)

但它只有毫秒的方法.

我怎样才能达到与Joda-Time相同的效果?

datetime jodatime java-8 java-time

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

if/else in Reactive JDK 8

我是Reactive的新手.使用JDK 1.8,如何将这些命令式代码转换为Reactive风格.

List<int> evenArr, oddArr, arr;
// pretending 'arr' have some values, 'evenArr' & 'oddArr' have already init
for (int n : arr) {
    if (n%2) evenArr.add(n);
    else oddArr.add(n);
}
Run Code Online (Sandbox Code Playgroud)

现在我只想到两次搜索'arr',如:

arr.stream().filter(n -> n%2).foreach(evenArr::add);
arr.stream().filter(n -> n%2!=0).foreach(oddArr::add);
Run Code Online (Sandbox Code Playgroud)

还有其他方法吗?搜索'arr'两次是昂贵的.

java reactive-programming java-8 java-stream

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

Java 8流过滤器 - 基于排序的pdate

我试图在过滤器中对字段进行排序.

输入文件/样本记录:

DocumentList: [
    Document{
        {
            _id=5975ff00a213745b5e1a8ed9,
            u_id=,
            mailboxcontent_id=5975ff00a213745b5e1a8ed8,                
            idmapping=Document{
                {ptype=PDF, cid=00988, normalizedcid=00988, systeminstanceid=, sourceschemaname=, pid=0244810006}
            },
            batchid=null,
            pdate=Tue Jul 11 17:52:25 IST 2017, locale=en_US
        }
    },
    Document{
        {
            _id=597608aba213742554f537a6,
            u_id=,
            mailboxcontent_id=597608aba213742554f537a3, 
            idmapping=Document{
                {platformtype=PDF, cid=00999, normalizedcid=00999, systeminstanceid=, sourceschemaname=, pid=0244810006}
            },
            batchid=null,
            pdate=Fri Jul 28 01:26:22 IST 2017,
            locale=en_US
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

在这里,我需要根据pdate进行排序.

List<Document> outList = documentList.stream()
    .filter(p -> p.getInteger(CommonConstants.VISIBILITY) == 1)
    .parallel()
    .sequential()
    .collect(Collectors.toCollection(ArrayList::new))
    .sort()
    .skip(skipValue)
    .limit(limtValue);
Run Code Online (Sandbox Code Playgroud)

不知道如何排序

"order by pdate DESC"
Run Code Online (Sandbox Code Playgroud)

先感谢您!

java sorting java-8 java-stream

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

Java 8,等于,==和Lambdas

(最后的实际问题)

你好,世界!我在这里发生了一些令人不安的事情,我无法绕过头...

像我一样懒惰,我讨厌一遍又一遍地重新实施愚蠢的euqals()方法; 还有hashCode()方法,但仍然关注选定成员变量的"相等".我还可以通过使用检查类实例或使用反射的默认接口来减少实现,但我想我已经使用了这个静态实用程序方法和labmda:

public class StackOverflow_TestEq {

    static public interface JcLambda_pG1_pG1_rBool<T> {
        boolean test(T p1, T p2);
    }

    static public <T> boolean equals_internal(final T pThisObject, final Object pOtherObject, final JcLambda_pG1_pG1_rBool<T> pEqualizer) {
        if (pThisObject == null) return pOtherObject == null;
        if (pOtherObject == null) return false;

        final Class<? extends Object> thisClass = pThisObject.getClass();
        if (!thisClass.isInstance(pOtherObject)) return false;

        @SuppressWarnings("unchecked") final T other = (T) pOtherObject;
        final boolean res = pEqualizer.test(pThisObject, other);
        //      System.out.println("Testing " + pThisObject + " vs " …
Run Code Online (Sandbox Code Playgroud)

java lambda equals-operator java-8

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

如何在没有if构造的情况下抛出异常

我创建了一个方法来检查列表中是否有一个具有特定id的元素,如果它不存在则抛出异常.我只是不知道如何检查match值是否false,然后抛出我的异常AccessToMessageForbiddenException.

private void validMessage(Long messageId) {
    List<Message> messageList = messageService.findBySender(1L);
    messageList.addAll(messageService.findByRecipient(1L));

    boolean match = messageList.stream().anyMatch(v -> messageId.equals(v.getId()));

    //How to throw an exception without an if construct
}
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

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