conditional/README.org

260 lines
8.1 KiB
Org Mode
Raw Normal View History

2018-07-28 19:42:35 +01:00
* Conditional
2018-07-28 19:53:31 +01:00
2018-07-28 19:42:35 +01:00
** Functional Condition and Value.
[[https://oss.sonatype.org/content/repositories/releases/net/kemitix/conditional][file:https://img.shields.io/nexus/r/https/oss.sonatype.org/net.kemitix/conditional.svg?style=for-the-badge]]
[[https://search.maven.org/#search%7Cga%7C1%7Cg%3A%22net.kemitix%22%20AND%20a%3A%22conditional%22][file:https://img.shields.io/maven-central/v/net.kemitix/conditional.svg?style=for-the-badge]]
[[https://sonarcloud.io/dashboard?id=net.kemitix%3Aconditional][file:https://img.shields.io/sonar/https/sonarcloud.io/net.kemitix%3Aconditional/coverage.svg?style=for-the-badge#.svg]]
[[https://sonarcloud.io/dashboard?id=net.kemitix%3Aconditional][file:https://img.shields.io/sonar/https/sonarcloud.io/net.kemitix%3Aconditional/tech_debt.svg?style=for-the-badge#.svg]]
[[https://sonarcloud.io/dashboard?id=net.kemitix%3Aconditional][file:https://sonarcloud.io/api/project_badges/measure?project=net.kemitix%3Aconditional&metric=sqale_rating#.svg]]
[[https://sonarcloud.io/dashboard?id=net.kemitix%3Aconditional][file:https://sonarcloud.io/api/project_badges/measure?project=net.kemitix%3Aconditional&metric=alert_status#.svg]]
[[https://sonarcloud.io/dashboard?id=net.kemitix%3Aconditional][file:https://sonarcloud.io/api/project_badges/measure?project=net.kemitix%3Aconditional&metric=reliability_rating#.svg]]
[[https://sonarcloud.io/dashboard?id=net.kemitix%3Aconditional][file:https://sonarcloud.io/api/project_badges/measure?project=net.kemitix%3Aconditional&metric=security_rating#.svg]]
[[https://sonarcloud.io/dashboard?id=net.kemitix%3Aconditional][file:https://sonarcloud.io/api/project_badges/measure?project=net.kemitix%3Aconditional&metric=sqale_index#.svg]]
[[https://sonarcloud.io/dashboard?id=net.kemitix%3Aconditional][file:https://sonarcloud.io/api/project_badges/measure?project=net.kemitix%3Aconditional&metric=vulnerabilities#.svg]]
[[https://sonarcloud.io/dashboard?id=net.kemitix%3Aconditional][file:https://sonarcloud.io/api/project_badges/measure?project=net.kemitix%3Aconditional&metric=bugs#.svg]]
[[https://sonarcloud.io/dashboard?id=net.kemitix%3Aconditional][file:https://sonarcloud.io/api/project_badges/measure?project=net.kemitix%3Aconditional&metric=code_smells#.svg]]
[[https://sonarcloud.io/dashboard?id=net.kemitix%3Aconditional][file:https://sonarcloud.io/api/project_badges/measure?project=net.kemitix%3Aconditional&metric=ncloc#.svg]]
[[https://app.codacy.com/project/kemitix/conditional/dashboard][file:https://img.shields.io/codacy/grade/1188742d676e457da91415d2b3a5faf1.svg?style=for-the-badge]]
[[http://i.jpeek.org/net.kemitix/conditional/index.html][file:http://i.jpeek.org/net.kemitix/conditional/badge.svg]]
** Maven
#+BEGIN_SRC xml
<dependency>
<groupId>net.kemitix</groupId>
<artifactId>conditional</artifactId>
<version>RELEASE</version>
</dependency>
#+END_SRC
The latest version should be shown above with the nexus and maven-central
badges or can be found on [[https://search.maven.org/#search%7Cga%7C1%7Cg%3A%22net.kemitix%22%20AND%20a%3A%22mon%22][Maven Central]].
** Condition
The `if ... then` and `if ... then ... else` constructs can't be used in a
lambda without being wrapped in a code block.
Using `Condition` allows the use of an if-style expression without needing to
wrap it in a code block
*** if-then
#+BEGIN_SRC java
if (isTrue()) {
doSomething();
}
Condition.where(isTrue())
.then(() -> doSomething());
#+END_SRC
*** if-then-else
#+BEGIN_SRC java
if (isTrue()) {
doSomething();
} else {
doSomethingElse();
}
Condition.where(isTrue())
.then(() -> doSomething())
.otherwise(() -> doSomethingElse());
#+END_SRC
*** isTrue() / isFalse() / not()
2018-07-28 19:42:35 +01:00
#+BEGIN_SRC java
final Condition condition = Condition.where(isTrue());
final boolean isTrue = condition.isTrue();
final boolean isFalse = condition.isFalse();
final Condition not = condition.not();
final Condition andCondition1 = condition.and(Condition.where(isAlsoTrue()));
final Condition andCondition2 = condition.and(isAlsoTrue());
final Condition orCondition1 = condition.or(Condition.where(isAlsoTrue()));
final Condition orCondition2 = condition.or(isAlsoTrue());
2018-07-28 19:42:35 +01:00
#+END_SRC
*** flatMap(Function<Boolean, Condition>)
2018-07-28 19:42:35 +01:00
#+BEGIN_SRC java
final Condition condition = Condition.where(isTrue())
.flatMap(b -> Condition.where(b));
2018-07-28 19:42:35 +01:00
#+END_SRC
*** if-and-then-else
2018-07-28 19:42:35 +01:00
#+BEGIN_SRC java
if (isTrue() && isAlsoTrue()) {
2018-07-28 19:42:35 +01:00
doSomething();
} else {
doSomethingElse();
}
Condition.where(isTrue())
.and(() -> isAlsoTrue())
2018-07-28 19:42:35 +01:00
.then(() -> doSomething())
.otherwise(() -> doSomethingElse());
#+END_SRC
*** if-or-then-else
2018-07-28 19:42:35 +01:00
#+BEGIN_SRC java
if (isTrue() || alternativeIsTrue()) {
2018-07-28 19:42:35 +01:00
doSomething();
} else {
doSomethingElse();
}
Condition.where(isTrue())
.or(() -> alternativeIsTrue())
2018-07-28 19:42:35 +01:00
.then(() -> doSomething())
.otherwise(() -> doSomethingElse());
#+END_SRC
*** if-then-else-if
#+BEGIN_SRC java
if (isFalse()) {
doSomething();
} else if (isTrue()) {
doSomethingElse();
}
Condition.where(isFalse())
.then(() -> doSomething())
.otherwise(() -> isTrue())
.then(() -> doSomethingElse());
#+END_SRC
*** if-then-if-then
#+BEGIN_SRC java
if (isTrue()) {
doSomething();
if (isAlsoTrue()) {
doSomethingElse();
}
}
Condition.where(isTrue())
.then(() -> doSomething())
.and(() -> isAlsoTrue())
.then(() -> doSomethingElse());
#+END_SRC
** Value
Values from an if-then-else in a functional-style.
Functional, and verbose, alternative to the ternary operator (=?:=).
*** if-then-else
#+BEGIN_SRC java
String result;
if (isTrue()) {
result = TRUE;
} else {
result = FALSE;
}
String result = isTrue() ? TRUE : FALSE;
final String result = Value.where(isTrue(), () -> TRUE, () -> FALSE);
final String result = Value.where(Condition.where(isTrue), () -> TRUE, () -> FALSE);
2018-07-28 19:42:35 +01:00
final Optional<String> result = Value.where(isTrue(), () -> TRUE);
final String result = Value.<String>where(isTrue())
.not()
.then(() -> FALSE)
.otherwise(() -> TRUE);
2018-07-28 19:42:35 +01:00
#+END_SRC
*** if-and-then-else
#+BEGIN_SRC java
String result;
if (isTrue() && alternativeIsTrue()) {
result = TRUE;
} else {
result = FALSE;
}
final String result = Value.<String>where(isTrue())
.and(() -> alternativeIsTrue())
.then(() -> TRUE)
.otherwise(() -> FALSE);
#+END_SRC
*** if-or-then-else
#+BEGIN_SRC java
String result;
if (isTrue() || alternativeIsTrue()) {
result = TRUE;
} else {
result = FALSE;
}
final String result = Value.<String>where(isTrue())
.or(() -> alternativeIsTrue())
.then(() -> TRUE)
.otherwise(() -> FALSE);
#+END_SRC
*** if-or-not-then-else
#+BEGIN_SRC java
String result;
if (isTrue() || !isFalse()) {
result = TRUE;
} else {
result = FALSE;
}
final String result = Value.<String>where(isTrue())
.orNot(() -> isFalse())
.then(() -> TRUE)
.otherwise(() -> FALSE);
#+END_SRC
*** if-then
#+BEGIN_SRC java
Optional<String> result;
if (isTrue()) {
result = Optional.of(TRUE);
} else {
result = Optional.empty();
}
final Optional<String> result = Value.<String>where(isTrue())
.then(() -> TRUE)
.optional();
#+END_SRC