diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/streamMigration/ReplaceWithFindFirstFix.java b/java/java-analysis-impl/src/com/intellij/codeInspection/streamMigration/ReplaceWithFindFirstFix.java index 5af4a5bc2e09..4110169cdea3 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/streamMigration/ReplaceWithFindFirstFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/streamMigration/ReplaceWithFindFirstFix.java @@ -64,7 +64,15 @@ class ReplaceWithFindFirstFix extends MigrateToStreamFix { PsiStatement[] statements = tb.getStatements(); if (statements.length != 2) return; PsiAssignmentExpression assignment = ExpressionUtils.getAssignment(statements[0]); - if (assignment == null) return; + if (assignment == null) { + if(!(statements[0] instanceof PsiExpressionStatement)) return; + PsiExpression expression = ((PsiExpressionStatement)statements[0]).getExpression(); + restoreComments(foreachStatement, body); + PsiElement result = foreachStatement.replace(elementFactory.createStatementFromText( + stream + ".ifPresent(" + LambdaUtil.createLambda(tb.getVariable(), expression) + ");", foreachStatement)); + simplifyAndFormat(project, result); + return; + } PsiExpression lValue = assignment.getLExpression(); if (!(lValue instanceof PsiReferenceExpression)) return; PsiElement element = ((PsiReferenceExpression)lValue).resolve(); diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/streamMigration/StreamApiMigrationInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/streamMigration/StreamApiMigrationInspection.java index 570f4b9a8fc5..5473f90dfeaf 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/streamMigration/StreamApiMigrationInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/streamMigration/StreamApiMigrationInspection.java @@ -568,7 +568,9 @@ public class StreamApiMigrationInspection extends BaseJavaBatchLocalInspectionTo registerProblem(statement, "anyMatch", new ReplaceWithMatchFix("anyMatch")); return; } - if (nonFinalVariables.size() == 1) { + if (nonFinalVariables.isEmpty() && statements[0] instanceof PsiExpressionStatement) { + registerProblem(statement, "findFirst", new ReplaceWithFindFirstFix()); + } else if (nonFinalVariables.size() == 1) { PsiAssignmentExpression assignment = ExpressionUtils.getAssignment(statements[0]); if(assignment == null) return; PsiExpression lValue = assignment.getLExpression(); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterFindFirstIfPresent.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterFindFirstIfPresent.java new file mode 100644 index 000000000000..45b201c3f37c --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterFindFirstIfPresent.java @@ -0,0 +1,13 @@ +// "Replace with findFirst()" "true" + +import java.util.*; + +public class Main { + public Integer[] testFindFirstIfPresent(List> data) { + List result = new ArrayList<>(); + for (List list : data) { + list.stream().filter(str -> !str.isEmpty()).findFirst().ifPresent(str -> result.add(str.length())); + } + return result.toArray(new Integer[result.size()]); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstIfPresent.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstIfPresent.java new file mode 100644 index 000000000000..fff3401e55cc --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstIfPresent.java @@ -0,0 +1,18 @@ +// "Replace with findFirst()" "true" + +import java.util.*; + +public class Main { + public Integer[] testFindFirstIfPresent(List> data) { + List result = new ArrayList<>(); + for (List list : data) { + for (String str : list) { + if (!str.isEmpty()) { + result.add(str.length()); + break; + } + } + } + return result.toArray(new Integer[result.size()]); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstIfPresentTwoStatements.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstIfPresentTwoStatements.java new file mode 100644 index 000000000000..cdc60d1eb8e8 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstIfPresentTwoStatements.java @@ -0,0 +1,20 @@ +// "Replace with findFirst()" "false" + +import java.util.*; + +// The result will have block-lambda so we don't suggest the replacement here +public class Main { + public Integer[] testFindFirstIfPresent(List> data) { + List result = new ArrayList<>(); + for (List list : data) { + for (String str : list) { + if (!str.isEmpty()) { + result.add(str.length()); + System.out.println(str); + break; + } + } + } + return result.toArray(new Integer[result.size()]); + } +} \ No newline at end of file