1. Overview
Java 12 added few useful APIs to the commonly used String class. In this tutorial, we will explore and use these new APIs.
- indent(int n)
- transform(Function<? super String,? extends R> f)
- describeConstable()
- resolveConstantDesc(MethodHandles.Lookup lookup)
Take a look at Java 11 String api methods which are discussed indepth in last article.
In all our example, we will use String string = "Java-W3schools";
In all our example, we will use String string = "Java-W3schools";
2. indent(int n)
As the name suggests, the indent() instance method provides the indentation for the given string that means it will add or remove the white characters at the beginning of the string.
Where method argument n indicates number of leading white space characters to add or remove.
Where method argument n indicates number of leading white space characters to add or remove.
2.1 Signature
public String indent(int n)
If n value is positive then adds leading white spaces.
If n value is negative then removes leading white spaces.
If n valuee is zero then the input string is unchanged.
If n value is negative then removes leading white spaces.
If n valuee is zero then the input string is unchanged.
2.2 Example - n positive
See the example program on indent method with value 5.String value = "indent";
System.out.println(value);
System.out.println(value.indent(5));
2.3 Output
indent
indent
See the difference between original string and indented string. Indented string now have 5 empty spaces added to it.
2.4 Example - n negative
In this example, passing negative value to it and added 4 empty spaces to the input string at the beginning.
String value = " indent";
System.out.println(value);
System.out.println(value.indent(5));
2.5 Output
Now observe the output and it has removed 2 empty spaces at beginning.indent
indent
If input string is not having empty spaces at beginning if n is negative then it will not do anything. Simply it returns same string.
2.6 Example - n is zero
String inputNZero = "welcome";
System.out.println(inputNZero.indent(0));
2.7 Output
welcome
2.8 Internal Code
Internally, first it convert input string into lines by calling line() method then it will add n empty spaces by calling " ".repeat(n). Finally, it appends the empty spaces to the each line at the beginning.public String indent(int n) {
return isEmpty() ? "" : indent(n, false);
}
private String indent(int n, boolean removeBlanks) {
Streamstream = removeBlanks ? lines(Integer.MAX_VALUE, Integer.MAX_VALUE)
: lines();
if (n > 0) {
final String spaces = " ".repeat(n);
stream = stream.map(s -> spaces + s);
} else if (n == Integer.MIN_VALUE) {
stream = stream.map(s -> s.stripLeading());
} else if (n < 0) {
stream = stream.map(s -> s.substring(Math.min(-n, s.indexOfNonWhitespace())));
}
return stream.collect(Collectors.joining("\n", "", "\n"));
}
3. transform(Function<? super String,? extends R> f)
Transform method is important and used to transform the string to one form to another form using Function Functional interface.
Must be used with lambda expression only because Function is part of java 8 stream api.
3.1 Signature
publicR transform(Function f)
3.2 Example
We will see few scenarios in this example program now. If we want to convert all elements of List into uppercase or append some value to it, then transform method is most usable.
Listfruits = new ArrayList<>();
fruits.add("Mango");
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Avvacado");
fruits.add("Papaya");
ListnewFruitsList = fruits.stream().map(s -> s.transform(str -> str.toUpperCase())).collect(Collectors.toList());
System.out.println(newFruitsList);
3.3 Output
From fruits list stream, taking one by one fruit name and passing to transform function which converts into uppercase by calling toUpperCase() method of String class. Collecting all outputs of trasform() method into a List using Collectors.toList() method.[MANGO, APPLE, BANANA, AVVACADO, PAPAYA]
Not only toUpperCase() method but also can be used any operation that can be performed on String either adding some conent to it or anything. Now just adding "Halwa" to each string in the fruites list.
s -> s.transform(str -> str + " Halwa")
Now the newFruitsList will have the values with added " Halwa" string to each fruit name.
[Mango Halwa, Apple Halwa, Banana Halwa, Avvacado Halwa, Papaya Halwa]
3.4 Internal Code
Internally it just invokes the f.apply() method.publicR transform(Function f) {
return f.apply(this);
}
4. describeConstable()
Returns an Optional containing the nominal descriptor for this instance, which is the instance itself.4.1 Signature
public OptionaldescribeConstable()
Java 12 has introduced Constants API in JEP 334. If you look at the String class documentation, it implements two new interfaces from Constants API – Constable, and ConstantDesc. This method is declared in the Constable interface and implemented in the String class.
4.2 Example
String status = "SUCCESS";
Optionaloptional = status.describeConstable();
System.out.println(optional);
System.out.println(optional.get());
System.out.println(optional.isPresent());
4.3 Output
Optional[SUCCESS]
SUCCESS
true
5. resolveConstantDesc(MethodHandles.Lookup lookup)
Resolves this instance as a ConstantDesc, the result of which is the instance itself.5.1 Signature
public String resolveConstantDesc(MethodHandles.Lookup lookup)
5.2 Example
String string = "resolveConstantDesc";
String constDesc = string.resolveConstantDesc(MethodHandles.lookup());
System.out.println(constDesc);
6. Conclusion
In this tutorial, We've seen the new methods added in java 12 version. indent(...) and transform() methods add great value to String API. But describeConstable() and resolveConstantDesc methods are not much useful for developers when work on Strings.Programs shown in this post are available on GitHub. All these programs are downloadable.
0 Comments