标签: java-stream

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
查看次数

在对象数组中搜索某些String

我找不到答案所以我必须发布一个新问题 - 虽然它似乎与已经在这里提出的其他几个问题相似 - 但重点是:

我有一些列表,例如:

private static List<Book> books = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

它包含了Book我所拥有的类的对象

private String title;
private String author;
Run Code Online (Sandbox Code Playgroud)

和吸气者和制定者.

现在我有了一个新对象Book(通过参数/ servlet从webform获得),我想检查新书的标题是否已经在列表中books.如果它已在该列表中,则打印一些控制台输出.如果不是,我想将整个新对象添加到列表中.为了做到这一点,我尝试使用常规的foreach循环来比较标题.有时候它有效,有时候没有(有时我的功能是以正确的方式比较两个标题,但有时不是 - 我不知道为什么).我知道有一种更好的方法可以使用Java 8.但是,对于Java 8,我是新手.有人能告诉我一个很好的方法吗?

java arraylist java-8 java-stream

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

Java 8 Stream/Collectors映射键与Collectors.counting()

我想得到频率键控的数组值频率图.我能够相反 - 按价值键入地图.尝试切换参数,但grouping by不接受Collector作为第一个参数.

另一个问题,我如何更改Map实现以LinkedHashMap保持数组元素的排序(如果地图由值键入)?

  int [] arr = {1, 4, 5, 9, 2, 4, 3, 1, 1, 3, 5, 3, 2, 4, 2, 9, 2, 1};

            Map<Integer, Long> collect = Arrays
                    .stream(arr)
                    .boxed()
                    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)

结果是 {1=4, 2=4, 3=3, 4=3, 5=2, 9=2} 我正在寻找的是 {4=1, 3=[4, 3] , 2=[5, 9] ... }这意味着有4次出现1次,3次出现4次,2次出现5次和9次.

我的目标是使用频率作为键获取Map,并将值作为数组元素列表.对于键冲突,请将另一个值添加到值列表中.

java java-8 java-stream

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

在检查null时,从对象列表中创建唯一的值列表

比如,有一个班,员工

@Getter
Class Employee {
    empId;
    empName;
    empDept;
}
Run Code Online (Sandbox Code Playgroud)

我试图从String部门的员工列表中获取逗号分隔的独特部门列表(例如:'销售','技术','运营','培训')

List<Employee> employees = getListOfEmployees();
String departments = getUniqueDepartments(employees);
Run Code Online (Sandbox Code Playgroud)

这就是我想要的:

String getUniqueDepartments(final List<Employee> employees) {
    return employees.stream().filter(emp -> emp.getEmpDept()!=null)
                      .map(emp -> String.format("'%s'", emp.getEmpDept()))
                      .collect(Collectors.joining(","))
}
Run Code Online (Sandbox Code Playgroud)

如何在此基础上添加distinct子句?

java lambda java-8 java-stream

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

使用流收集器从java对象获取键值

我正在尝试使用流和集合从对象列表中获取键和值列表,但我不知道是否可能.

我有这门课:

public class MyObject {

    private int key1;

    private String key2;

    private String key3;

    public int getKey1() { return key1; }

    public void setKey1(int key1) { this.key1 = key1; }

    public String getKey2() { return key2; }

    public void setKey2(String key2) { this.key2 = key2; }

    public String getKey3() { return key3; }

    public void setKey3(String key3) { this.key3 = key3; }
}
Run Code Online (Sandbox Code Playgroud)

我想处理这个对象的列表,并用逗号分隔所有值和所有键.

List<MyObject> objectList = myObjectList;
String keys = objectList.stream().collect(Collectors.joining(", ","(", ")"));
String values = Collections.nCopies(objectList.size(), "?").stream().collect(Collectors.joining(", …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream collectors

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

如何在Java 8流API中实现不变性

请考虑以下代码.我读到在处理Stream API时在代码中实现不变性非常重要.我们怎样才能获得具有不变性的小写项目列表?

    List<String> stockList = Arrays.asList("GOOG", "AAPL", "MSFT", "INTC");
    List<String> stockList2 = new ArrayList<>();
    stockList.parallelStream()
            .filter(e -> !e.contains("M"))
            .map(String::toLowerCase)
            .map(e -> stockList2.add(e))
            .collect(toList());
   stockList2.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

java immutability java-8 java-stream

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

如何在没有冗余计算的情况下过滤和映射Java 8流中的值?

我对Java 8 Collection流功能有一点肤浅的了解,所以我不确定以下是否可能:我想filter基于整数比较的集合并重用该值进行映射.

具体地说,如果Levenshtein距离小于一个值,我有一个Collection<String> strings并希望将每个值映射到Levenshtein到固定String x的距离levenshteinLimit.

String x = "some string";
Collection<String> strings = new LinkedList<>(Arrays.asList("not some string",
        "some other string"));
int levenshteinLimit = 10;
Map<Integer, String> stringsLevenshteinMap = strings.stream()
        .filter(string -> LevenshteinDistance.getDefaultInstance().apply(x, string) < levenshteinLimit)
        .collect(Collectors.toMap(string -> LevenshteinDistance.getDefaultInstance().apply(x, string), Function.identity()));
System.out.println(stringsLevenshteinMap);
Run Code Online (Sandbox Code Playgroud)

效果很好并且表达了我正在寻找的结果,但需要冗余的距离计算.到目前为止,这不是问题.没有流的解决方案也是可能的.我正在努力学习新的东西.

我假设首先过滤然后映射更有效,因为对象的数量可能更小,这意味着更少的工作.

上面的代码使用Apache commons-text 1.1.可以在https://github.com/krichter722/java-filter-and-map-without-redundancy找到示例项目.

java collections java-stream

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

Java流过滤器与正则表达式无法正常工作

希望有人能帮助我.我有ArrayList一Invoice堂课.我想要得到的是过滤这个ArrayList并找到其中一个属性与a匹配的第一个元素regex.这个Invoice类看起来像这样:

public class Invoice {
   private final SimpleStringProperty docNum;
   private final SimpleStringProperty orderNum;

   public Invoice{
    this.docNum = new SimpleStringProperty();
    this.orderNum = new SimpleStringProperty(); 
}   

   //getters and setters
}
Run Code Online (Sandbox Code Playgroud)

我正在使用它regex (\\D+)进行过滤,以便查找orderNum属性中是否存在任何不具有整数格式的值.所以基本上我正在使用这个流

    Optional<Invoice> invoice = list
                            .stream()
                            .filter(line -> line.getOrderNum())
                            .matches("(\\D+)"))
                            .findFirst();
Run Code Online (Sandbox Code Playgroud)

但它不起作用.任何的想法?我一直在寻找,我发现如何使用pattern.asPredicate()像这样:

Pattern pattern = Pattern.compile("...");

List<String> matching = list.stream()
        .filter(pattern.asPredicate())
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

随着List的Integer,String等等,但我还没有找到如何与做POJO.任何帮助都感激不尽.美好的一天

java regex pojo java-8 java-stream

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

在PropertyDescriptors数组上编译Stream的toMap()函数中的错误

我有以下代码:

    PropertyDescriptor[] propertyDescriptors = Introspector.getBeanInfo(Mailingadresse.class).getPropertyDescriptors();
    Map<String, PropertyDescriptor> m = Arrays
        .stream(propertyDescriptors)
        .filter(pd -> pd.getReadMethod() != null)
        .collect(Collectors.toMap(pd -> pd.getName().toLowerCase(), Function::identity));
Run Code Online (Sandbox Code Playgroud)

Eclipse显示

收集器类型中的Map(Function,Function)方法不适用于参数((pd) - > {},Function :: identity)

为什么是这样?

java dictionary java-8 java-stream

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