This is an automated email from the ASF dual-hosted git repository.

hepin pushed a commit to branch BooleanSupplier
in repository https://gitbox.apache.org/repos/asf/pekko.git

commit 5f2964de27b2be42c5ca34ff4e0a99e53457f936
Author: He-Pin <[email protected]>
AuthorDate: Sat Sep 13 15:15:24 2025 +0800

    chore: Add BooleanSupplier that can throw and make Predicate can throw
---
 .../org/apache/pekko/japi/FunctionLawTest.java     |  4 ++--
 .../pekko/japi/function/BooleanSupplier.java       | 26 ++++++++++++++++++++++
 .../pekko/japi/pf/FSMStateFunctionBuilder.java     |  2 +-
 .../org/apache/pekko/japi/pf/FSMStopBuilder.java   |  2 +-
 .../org/apache/pekko/japi/pf/ReceiveBuilder.java   | 21 ++++++++---------
 .../org/apache/pekko/japi/pf/UnitPFBuilder.java    |  4 ++--
 .../javaapi-functions.excludes                     |  1 +
 .../org/apache/pekko/japi/function/Function.scala  |  2 ++
 .../test/java/jdocs/stream/GraphStageDocTest.java  |  2 +-
 .../fsm/japi/pf/FSMStateFunctionBuilder.java       |  2 +-
 .../persistence/fsm/japi/pf/FSMStopBuilder.java    |  3 ++-
 11 files changed, 50 insertions(+), 19 deletions(-)

diff --git 
a/actor-tests/src/test/java/org/apache/pekko/japi/FunctionLawTest.java 
b/actor-tests/src/test/java/org/apache/pekko/japi/FunctionLawTest.java
index 63f92ad6f0..4c3caca367 100644
--- a/actor-tests/src/test/java/org/apache/pekko/japi/FunctionLawTest.java
+++ b/actor-tests/src/test/java/org/apache/pekko/japi/FunctionLawTest.java
@@ -53,7 +53,7 @@ public class FunctionLawTest {
   }
 
   @Test
-  public void testPredicateNegate() {
+  public void testPredicateNegate() throws Exception {
     final Predicate<Object> alwaysTrue = o -> true;
     final Predicate<Object> alwaysFalse = alwaysTrue.negate();
     Assert.assertTrue(alwaysTrue.test(new Object()));
@@ -62,7 +62,7 @@ public class FunctionLawTest {
   }
 
   @Test
-  public void testPredicate2Negate() {
+  public void testPredicate2Negate() throws Exception {
     final Predicate2<Object, Object> alwaysTrue = (o1, o2) -> true;
     final Predicate2<Object, Object> alwaysFalse = alwaysTrue.negate();
     Assert.assertTrue(alwaysTrue.test(new Object(), new Object()));
diff --git 
a/actor/src/main/java/org/apache/pekko/japi/function/BooleanSupplier.java 
b/actor/src/main/java/org/apache/pekko/japi/function/BooleanSupplier.java
new file mode 100644
index 0000000000..6d6b853c79
--- /dev/null
+++ b/actor/src/main/java/org/apache/pekko/japi/function/BooleanSupplier.java
@@ -0,0 +1,26 @@
+package org.apache.pekko.japi.function;
+
+import java.io.Serializable;
+
+/**
+ * Represents a supplier of {@code boolean}-valued results.
+ *
+ * @since 2.0.0
+ */
+public interface BooleanSupplier extends Serializable {
+  long serialVersionUID = 1L;
+
+  /**
+   * Gets a result.
+   *
+   * @return a result
+   * @throws Exception if an error occurs
+   */
+  boolean get() throws Exception;
+
+  /** A constant BooleanSupplier that always returns false. */
+  BooleanSupplier FALSE_SUPPLIER = () -> false;
+
+  /** A constant BooleanSupplier that always returns true. */
+  BooleanSupplier TRUE_SUPPLIER = () -> true;
+}
diff --git 
a/actor/src/main/java/org/apache/pekko/japi/pf/FSMStateFunctionBuilder.java 
b/actor/src/main/java/org/apache/pekko/japi/pf/FSMStateFunctionBuilder.java
index 13cfe319c7..95c0414d61 100644
--- a/actor/src/main/java/org/apache/pekko/japi/pf/FSMStateFunctionBuilder.java
+++ b/actor/src/main/java/org/apache/pekko/japi/pf/FSMStateFunctionBuilder.java
@@ -54,7 +54,7 @@ public class FSMStateFunctionBuilder<S, D> {
         FSM.Event.class,
         new Predicate<FSM.Event>() {
           @Override
-          public boolean test(FSM.Event e) {
+          public boolean test(FSM.Event e) throws Exception {
             boolean res = true;
             if (eventOrType != null) {
               if (eventOrType instanceof Class eventType) {
diff --git a/actor/src/main/java/org/apache/pekko/japi/pf/FSMStopBuilder.java 
b/actor/src/main/java/org/apache/pekko/japi/pf/FSMStopBuilder.java
index 5fcfc6e4e9..6efbd17b55 100644
--- a/actor/src/main/java/org/apache/pekko/japi/pf/FSMStopBuilder.java
+++ b/actor/src/main/java/org/apache/pekko/japi/pf/FSMStopBuilder.java
@@ -96,7 +96,7 @@ public class FSMStopBuilder<S, D> {
         FSM.StopEvent.class,
         new Predicate<FSM.StopEvent>() {
           @Override
-          public boolean test(FSM.StopEvent e) {
+          public boolean test(FSM.StopEvent e) throws Exception {
             if (reasonType.isInstance(e.reason())) {
               @SuppressWarnings("unchecked")
               P p = (P) e.reason();
diff --git a/actor/src/main/java/org/apache/pekko/japi/pf/ReceiveBuilder.java 
b/actor/src/main/java/org/apache/pekko/japi/pf/ReceiveBuilder.java
index eee8582b6c..64e9bb6738 100644
--- a/actor/src/main/java/org/apache/pekko/japi/pf/ReceiveBuilder.java
+++ b/actor/src/main/java/org/apache/pekko/japi/pf/ReceiveBuilder.java
@@ -140,7 +140,7 @@ public class ReceiveBuilder {
    */
   public <P> ReceiveBuilder match(
       final Class<P> type,
-      final java.util.function.BooleanSupplier externalPredicate,
+      final org.apache.pekko.japi.function.BooleanSupplier externalPredicate,
       final Procedure<P> apply) {
     return matchUnchecked(type, externalPredicate, apply);
   }
@@ -162,7 +162,7 @@ public class ReceiveBuilder {
     Predicate<Object> fiPredicate =
         new Predicate<>() {
           @Override
-          public boolean test(Object o) {
+          public boolean test(Object o) throws Exception {
             if (!type.isInstance(o)) return false;
             else return ((Predicate<Object>) predicate).test(o);
           }
@@ -187,13 +187,13 @@ public class ReceiveBuilder {
   @SuppressWarnings("unchecked")
   public <P> ReceiveBuilder matchUnchecked(
       final Class<?> type,
-      final java.util.function.BooleanSupplier externalPredicate,
+      final org.apache.pekko.japi.function.BooleanSupplier externalPredicate,
       final Procedure<P> apply) {
     Predicate<Object> fiPredicate =
         new Predicate<>() {
           @Override
-          public boolean test(Object o) {
-            return type.isInstance(o) && externalPredicate.getAsBoolean();
+          public boolean test(Object o) throws Exception {
+            return type.isInstance(o) && externalPredicate.get();
           }
         };
 
@@ -237,7 +237,7 @@ public class ReceiveBuilder {
         new UnitCaseStatement<Object, P>(
             new Predicate<>() {
               @Override
-              public boolean test(Object o) {
+              public boolean test(Object o) throws Exception {
                 if (!object.equals(o)) return false;
                 else {
                   @SuppressWarnings("unchecked")
@@ -262,9 +262,9 @@ public class ReceiveBuilder {
   @SuppressWarnings("unchecked")
   public <P> ReceiveBuilder matchEquals(
       final P object,
-      final java.util.function.BooleanSupplier externalPredicate,
+      final org.apache.pekko.japi.function.BooleanSupplier externalPredicate,
       final Procedure<P> apply) {
-    final Predicate<Object> predicate = o -> object.equals(o) && 
externalPredicate.getAsBoolean();
+    final Predicate<Object> predicate = o -> object.equals(o) && 
externalPredicate.get();
     addStatement(new UnitCaseStatement<>(predicate, (Procedure<Object>) 
apply));
     return this;
   }
@@ -290,8 +290,9 @@ public class ReceiveBuilder {
    * @return a builder with the case statement added
    */
   public ReceiveBuilder matchAny(
-      final java.util.function.BooleanSupplier externalPredicate, final 
Procedure<Object> apply) {
-    final Predicate<Object> predicate = o -> externalPredicate.getAsBoolean();
+      final org.apache.pekko.japi.function.BooleanSupplier externalPredicate,
+      final Procedure<Object> apply) {
+    final Predicate<Object> predicate = o -> externalPredicate.get();
     addStatement(new UnitCaseStatement<>(predicate, apply));
     return this;
   }
diff --git a/actor/src/main/java/org/apache/pekko/japi/pf/UnitPFBuilder.java 
b/actor/src/main/java/org/apache/pekko/japi/pf/UnitPFBuilder.java
index 279620f0bd..910d94975e 100644
--- a/actor/src/main/java/org/apache/pekko/japi/pf/UnitPFBuilder.java
+++ b/actor/src/main/java/org/apache/pekko/japi/pf/UnitPFBuilder.java
@@ -95,7 +95,7 @@ public final class UnitPFBuilder<I> extends 
AbstractPFBuilder<I, BoxedUnit> {
     Predicate<I> fiPredicate =
         new Predicate<I>() {
           @Override
-          public boolean test(final I param) {
+          public boolean test(final I param) throws Exception {
             if (!type.isInstance(param)) {
               return false;
             } else {
@@ -144,7 +144,7 @@ public final class UnitPFBuilder<I> extends 
AbstractPFBuilder<I, BoxedUnit> {
         new UnitCaseStatement<I, P>(
             new Predicate<I>() {
               @Override
-              public boolean test(final I param) {
+              public boolean test(final I param) throws Exception {
                 if (!object.equals(param)) {
                   return false;
                 } else {
diff --git 
a/actor/src/main/mima-filters/2.0.x.backwards.excludes/javaapi-functions.excludes
 
b/actor/src/main/mima-filters/2.0.x.backwards.excludes/javaapi-functions.excludes
index 755be7d74e..05771f3e0a 100644
--- 
a/actor/src/main/mima-filters/2.0.x.backwards.excludes/javaapi-functions.excludes
+++ 
b/actor/src/main/mima-filters/2.0.x.backwards.excludes/javaapi-functions.excludes
@@ -36,4 +36,5 @@ 
ProblemFilters.exclude[MissingClassProblem]("org.apache.pekko.japi.Procedure")
 
ProblemFilters.exclude[IncompatibleMethTypeProblem]("org.apache.pekko.pattern.Patterns.askWithReplyTo")
 
ProblemFilters.exclude[IncompatibleMethTypeProblem]("org.apache.pekko.serialization.SerializationSetup.create")
 
ProblemFilters.exclude[IncompatibleMethTypeProblem]("org.apache.pekko.pattern.Patterns.retry")
+ProblemFilters.exclude[IncompatibleSignatureProblem]("org.apache.pekko.japi.function.Predicate.test")
 
diff --git a/actor/src/main/scala/org/apache/pekko/japi/function/Function.scala 
b/actor/src/main/scala/org/apache/pekko/japi/function/Function.scala
index 669e634800..51efe84c52 100644
--- a/actor/src/main/scala/org/apache/pekko/japi/function/Function.scala
+++ b/actor/src/main/scala/org/apache/pekko/japi/function/Function.scala
@@ -110,6 +110,7 @@ trait Effect extends java.io.Serializable {
 @SerialVersionUID(1L)
 @FunctionalInterface
 trait Predicate[-T] extends java.io.Serializable {
+  @throws(classOf[Exception])
   def test(param: T): Boolean
 
   /**
@@ -128,6 +129,7 @@ trait Predicate[-T] extends java.io.Serializable {
 @SerialVersionUID(1L)
 @FunctionalInterface
 trait Predicate2[-T1, -T2] extends java.io.Serializable {
+  @throws(classOf[Exception])
   def test(param1: T1, param2: T2): Boolean
 
   /**
diff --git a/docs/src/test/java/jdocs/stream/GraphStageDocTest.java 
b/docs/src/test/java/jdocs/stream/GraphStageDocTest.java
index fb123701d0..32461e7850 100644
--- a/docs/src/test/java/jdocs/stream/GraphStageDocTest.java
+++ b/docs/src/test/java/jdocs/stream/GraphStageDocTest.java
@@ -260,7 +260,7 @@ public class GraphStageDocTest extends AbstractJavaTest {
               in,
               new AbstractInHandler() {
                 @Override
-                public void onPush() {
+                public void onPush() throws Exception {
                   A elem = grab(in);
                   if (p.test(elem)) {
                     push(out, elem);
diff --git 
a/persistence/src/main/java/org/apache/pekko/persistence/fsm/japi/pf/FSMStateFunctionBuilder.java
 
b/persistence/src/main/java/org/apache/pekko/persistence/fsm/japi/pf/FSMStateFunctionBuilder.java
index 908e25f9b6..dd93b69c08 100644
--- 
a/persistence/src/main/java/org/apache/pekko/persistence/fsm/japi/pf/FSMStateFunctionBuilder.java
+++ 
b/persistence/src/main/java/org/apache/pekko/persistence/fsm/japi/pf/FSMStateFunctionBuilder.java
@@ -64,7 +64,7 @@ public class FSMStateFunctionBuilder<S, D, E> {
         org.apache.pekko.persistence.fsm.PersistentFSM.Event.class,
         new Predicate<PersistentFSM.Event>() {
           @Override
-          public boolean 
test(org.apache.pekko.persistence.fsm.PersistentFSM.Event e) {
+          public boolean 
test(org.apache.pekko.persistence.fsm.PersistentFSM.Event e) throws Exception {
             boolean res = true;
             if (eventOrType != null) {
               if (eventOrType instanceof Class eventType) {
diff --git 
a/persistence/src/main/java/org/apache/pekko/persistence/fsm/japi/pf/FSMStopBuilder.java
 
b/persistence/src/main/java/org/apache/pekko/persistence/fsm/japi/pf/FSMStopBuilder.java
index f5949f2590..48941bfb2a 100644
--- 
a/persistence/src/main/java/org/apache/pekko/persistence/fsm/japi/pf/FSMStopBuilder.java
+++ 
b/persistence/src/main/java/org/apache/pekko/persistence/fsm/japi/pf/FSMStopBuilder.java
@@ -106,7 +106,8 @@ public class FSMStopBuilder<S, D> {
         org.apache.pekko.persistence.fsm.PersistentFSM.StopEvent.class,
         new 
Predicate<org.apache.pekko.persistence.fsm.PersistentFSM.StopEvent>() {
           @Override
-          public boolean 
test(org.apache.pekko.persistence.fsm.PersistentFSM.StopEvent e) {
+          public boolean 
test(org.apache.pekko.persistence.fsm.PersistentFSM.StopEvent e)
+              throws Exception {
             if (reasonType.isInstance(e.reason())) {
               @SuppressWarnings("unchecked")
               P p = (P) e.reason();


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to