Tag: java stream

如何在O(N)时间和O(C)空间复杂度中使用Java 8流API从列表中仅删除一个max(min)

这是一个代码,用于从列表中仅删除其中一个最大值(在这种情况下是第一个,但这是无关紧要的)。 时间为O(n) ,空间为O(n) (超出输入)。 public List removeOneOfTheMax(List nums) { int max = Integer.MIN_VALUE; int maxIndex = -1; Iterator it = nums.iterator(); for (int i = 0; it.hasNext(); i++) { Integer temp = it.next(); if (max < temp) { maxIndex = i; max = temp; } } nums.remove(maxIndex); return nums; } 1.与使用Java 8流API的方法相同的是什么? 我想保留时间和空间的复杂性,因此不允许排序。 2.实际上,如果你将LinkedList传递给上面的代码,空间复杂度将是O(C) (再次超出输入),但据我所知, […]

如何在java 8中使用流将集合/数组转换为JSONArray

我有一个双数组,我需要使用java流将数组转换为JSONArray。 我尝试使用forEach(共享可变性),这会导致数据丢失。 public static JSONArray arrayToJson(double[] array) throws JSONException{ JSONArray jsonArray = new JSONArray(); Arrays.stream(array) .forEach(jsonArray::put); return jsonArray; } 有什么方法可以使用流创建JSONArray吗?

Java 8 – Streams嵌套ForEach与不同的Collection

我尝试理解新的Java 8 Streams,并且我尝试了几天将嵌套的foreach循环转移到Java 8 Streams中的集合上。 是否有可能重构以下嵌套的foreach循环,包括Java-8-Streams中的if-conditions? 如果是的话会是什么样子。 ArrayList Inq = new ArrayList(); TreeMap Quotations = new TreeMap(); ArrayList tempInqAndQuot = new ArrayList(); ArrayList tempQuotPos = new ArrayList(); for (ClassInq simInq : this.Inq){ if (!simInq.isClosed() && !simInq.isDenied()){ for (Map.Entry Quot: Quotations.entrySet()){ SalesQuot sapQuot = Quot.getValue(); if (sapQuot.getInquiryDocumentNumber().compareTo(simInq.getSapInquiryNumber()) == 0){ simInq.setSAPQuotationNumber(sapQuot.getQuotationDocumentNumber()); tempInqAndQuot.add(simInq); for (Map.Entry quotp : sapQuot.getPosition().entrySet()){ […]

如何从Java 8中的Iterator获取n个第一个值?

我已经使用按照值(Java)将Map 排序到我有一个LinkedHashMap ,即保证迭代顺序的Iterable ,对HashMap进行了排序 。 现在,我想使用一行代码检索地图的前n个条目的java.util.List ,如果可能的话,使用Java 8 Collection Stream API技术。 我发现如何从Iterator获得两个连续值,这解释了有可能用数组做到这一点,但这并不优雅,不同于我获得List意图(虽然可以转换,但这是不必要的步骤)并需要一个额外的方法。

对一个集合的元素执行操作并迭代结果以执行其他操作

如果我有2个collections, List domainArr; List personArr; 我想对String中的每个元素进行一次小的转换,然后遍历personArr List urlArr = strArr.stream() .map(str -> “https://” + strArr) .collect(Collectors.toList()); 我有一个方法 List getPersons(String url){ /*makes a restful call to the url and gets a List of objects for each URL.*/ } 我想迭代来自urlArr的每个url并将其传递给getPersons(url)方法,并且对于每个获得的结果(List),我想迭代该人并对这些人执行更多操作 persons.stream() .filter(Objects::nonNull) .map(Person::getName) .filter(Objects::nonNull) .collect(Collectors.toList()); 我希望从所有结果中得到所有人名。 我想知道如何在Java 8中实现这一function。任何指针?

如何将参数发送到流中的引用方法(java 8)?

我有一个活动列表(活动),我想确定一个Map(String, DateTime)的表格Map(String, DateTime) (不是Duration或Period;它是必须的Map(String, DateTime)的数据结构。 对于每个活动,在监测期间计算的总持续时间。 Activity类有: activityLabel(String) , startTime(DateTime) , endTime(DateTime) 。 我用joda时间。 这就是我所做的: Map durations = activities.stream().collect(Collectors.toMap( it -> it.activityLabel, it ->new DateTime(0,0,0,0,0,0) //,DateTime::plus )); 我想我应该使用DateTime plus(ReadablePeriod period)或DateTime plus(ReadableDuration duration) ,但我不知道如何将类型为Duration或Period的参数发送到方法引用。 我怎样才能达到这个效果? 编辑:输入: 2011-12-03 01:00:00 2011-12-03 9:00:00睡觉 2011-12-04 03:00:00 2011-12-04 10:30:00睡觉 我应该有输出:睡觉0-0-0 15:30:00(年,月,日,小时,分钟,秒)

流减少不兼容的类型

我正在尝试创建一个包含多个谓词并减少它们的查找程序: public static Collection findOr( Context pContext, Class pClass, Predicate… pPredicates) { Predicate lReducedPredicate = Arrays.asList(pPredicates).stream().reduce(Predicate::or).orElse(r -> false); return find(pContext, pClass, lReducedPredicate); } 不幸的是我得到以下编译错误: Predicate lReducedPredicate = Arrays.asList(pPredicates).stream()。reduce(Predicate :: or).orElse(r – > false); 不兼容的类型:谓词不能转换为谓词,其中T是一个类型变量:T扩展在方法findOr(Context,Class,Predicate …)中声明的BusinessInterface,其中CAP#1,CAP#2是新的类型变量:CAP# 1扩展Object super:T从捕获? 超级T CAP#2扩展了Object super:T从捕获? 超级T 我在Eclipse中没有错误,我不知道出了什么问题。 任何帮助真的很感激:)。

如何在Java 8中找到N个数字中最大的M个数字?

IntStream可能是最简单的方法,但我只能选择最小的M数,如下所示: public class Test { private static final int[] arr = {5, 3, 4, 2, 9, 1, 7, 8, 6}; public static void main(String[] args) throws Exception { System.out.println(Arrays.asList(IntStream.of(arr).sorted().limit(5).boxed().toArray())); } } 顺便说一句,考虑到算法的复杂性并假设N >> M,“排序+限制”方法只有O(N log(N))的复杂度。 我认为最好的复杂性可能达到O(N log(M)),但我不知道Java 8是否有这种流方法或收集器。

多个联合查询选择后java 8

这是我想在MySQL中尝试的查询 SELECT Ax FROM A WHERE Ay = ‘P’ UNION SELECT Ax FROM A WHERE Ay = ‘Q’ 以上是我正在尝试的原始查询的简化版本。 在我的原始查询中,每个SELECT语句都涉及带有INNER JOIN多个表 如果我需要查询的表’A’的’y’列中可能的值的数量是’n’,那么我的查询将涉及在’ SELECT语句上执行’n-1’联合 我知道JOOQ可以组合多个SELECT语句。 但是有没有一个很好的方法来发布Java 8风格? 也许使用Steam.collect()? 这就是我的想法,但我想知道我是否能做得更好 String firstValueToQuery = valuesToQuery.get(0); Select<Record5> selectQuery = getSelectQueryForValue(firstValueToQuery); valuesToQuery.stream() .skip(1) .forEach(valueToQuery -> selectQuery.unionAll(getSelectQueryForValue(valueToQuery))); selectQuery.fetchStream(); 这是我实现getSelectQueryForValue private Select<Record5> getSelectQueryForValue(String valueToQuery) { return jooq.select( AP, AQ, AR, AS, AT) […]

使用java stream过滤谓词时记录filter的结果

场景是我创建了不同类型的filter,它们根据对象的属性过滤一些对象的列表。 因此,我创建了一个由每个filterinheritance的AbstractObjectFilter类。 AbstractObjectFilter.java public abstract class AbstractEventFilter { protected abstract Predicate isEligible(); public List getFilteredEvents(final List events) { return events.stream().filter(isEligible()).collect(Collectors.toList()); } } 所以现在每个filter都扩展了这个类并覆盖了isEligible(),并且在该函数中它根据其属性返回谓词。 例如: – MinNumOfPrizesFilter.java public class MinimumNumOfPrizesFilter extends AbstractEventFilter { private int minimumNumOfPrizes; public MinimumNumOfPrizesFilter(@NonNull int minimumNumOfPrizes) { this.minimumNumOfPrizes = minimumNumOfPrizes; } @Override protected Predicate isEligible() { return event -> event.getPrizeCount() >= minimumNumOfPrizes; […]