类型为Stream <employee>的方法filter(Predicate <!-?super Employee->)不适用于参数((<no type =“”> e)-> {})

时间:2019-03-06 04:50:06

标签: java java-8 java-stream

如何在Java 8中的过滤器中设置值?我想将firstId为Raj的emailId设置为null。如何在Java8中做到这一点?

<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.3/umd/react-dom.production.min.js"></script>

<div id='root'>
</div>

4 个答案:

答案 0 :(得分:3)

Filter方法应返回boolean,我认为应该没有任何副作用。在您的情况下,简单循环即可完成工作:

for(Employee employee: employees) {
    if(e.getFirstName().equals("Raj")) {
        e.setEmail(null);
    }
}

但是如果您真的想使用流:

employees.stream() //get stream
    .filter(e -> e.getFirstName().equals("Raj")) //filter entries with first name Raj
    .forEach(e -> e.setEmail(null)); //for each of them set email to null

或(如果要处理整个列表并返回所有条目的更改,则:

employees.stream() //get stream
    .map(e -> {
        if(e.getFirstName().equals("Raj")) {
            e.setEmail(null);
        }
        return e;
    })
    .collect(Collectors.toList());

答案 1 :(得分:2)

我们还可以使用 Collectors.mapping 来检查firstName是否为Raj,然后在其中将email设置为null映射函数(第一个参数),然后将其收集到新的List(第二个参数)中:

employees.stream().collect(Collectors.mapping(emp -> {
          if("Raj".equals(emp.getFirstName())) {
              emp.setEmail(null); 
          } 
          return emp;
          }, Collectors.toList()));

并且如nullpointer建议的那样,请勿使流中的对象突变。您可以使用副本构造函数来复制EmployeefirstName的{​​{1}}的副本  并将Raj属性设置为email

null

答案 2 :(得分:1)

另一方面,您可以将List.replaceAll用作:

<uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

 <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="https"
          android:host="www.dropbox.com" />

        <data android:scheme="https"
          android:host="www.dropbox.com/oauth2/authorize" />
<!-- Oauth2 redirect url set when dropbox app is created --> 
        <data android:scheme="com.companyname.appname.oauth"
          android:host="oauthredirect" />
      </intent-filter>

答案 3 :(得分:0)

使用filter中的mapJava8,您可以这样做:

employees.stream()
         .filter(e -> e.getFirstName().equalsIgnoreCase("Raj"))
         .map(e -> {
              e.setEmail(null);
              return e;
       }).findAny();