The Java Stream
API has many useful methods. If we want to transform a Stream
to a Java array we can use the toArray
method. Without an argument the result is an object array (Object[]
), but we can also use an argument to return an array of another type. The easiest way is to use the contructor of the array type we want as method reference. Then the result is an array of the given type with the elements of the stream.
This is very useful if we have a Java Stream
and want to use the elements to invoke a method with a variable arguments parameter. In Java we can pass an array object as variable arguments argument to a method. So if we transform the Stream
to an array we can invoke the method with that value.
Continue reading →
One of the first topics you will encounter when studying functional programming will probably be currying. For an imperative programmer not used to mathematical notations, chances are you will find the concept hard to grasp. Then let this be the day you will remember as the day you completely understood currying!
Continue reading →
When you maintain a large Java project for a longer period, the moments where you’re finally able to remove unused code can be very satisfying.
No more upkeep, library version migrations or dark corners to maintain, for code that’s no longer being used.
But finding out which parts of the code base can be removed can be a challenge, and tooling in this space seems not to have kept pace with recent development practices in Java.
In this post we’ll outline an approach to find unreferenced code with ArchUnit, which allows you to iteratively detect & delete unused code from your Java projects.
Continue reading →
The Optional
class has the orElse
and orElseGet
methods to return a value when the Optional
object is empty. This is useful to return a default value for example. But there is a small difference between the two methods. The orElseGet
method needs a Supplier
argument that returns a value of the type of the Optional
value. The Supplier
is only invoked when the Optional
value is empty. The statement passed as argument to the orElse
method is always executed, even when the Optional
value is not empty. Preferrably we should use orElseGet
as it will only invoke statements if needed.
In the following example code we see when our method getDefaultGreeting
is invoked by using orElse
and orElseGet
with an empty and non-empty Optional
object:
Continue reading →
Since I’ve been working on a Mac, I replaced the default terminal with iTerm2.
It provides some nice features like searching, autocomplete, or allowing to see images in the terminal.
But this one is my favorite one, the undo close tab / session.
Don’t you just hate it when you have multiple terminal tabs open, and accidentally close one?
Just that one where you had an important process running, or tailing an error log?
I do! :)
This is just a short blogpost how iTerm2 helps me having more fun using my terminal.
Actually it’s not much of a blogpost, this provides some screenshots.
Sometimes an image says more than words.
Continue reading →
Many projects force their code to be formatted.
We use spotless for this purpose.
It can check for propper formatting, and also format the code for you.
Then build pipeline checks if the code is properly formatted.
Failing pipelines due to formatting errors are annoying and cost a lot of time and money.
This blog proposes a solution.
Git has some hooks that you can install.
Hooks are scripts that are run at specific events such as pre-commit, post-commit, pre-push, prepare-commit-msg, pre-rebase, etc.
I created a script that formats the code in the pre-commit hook.
It does:
-
This scripts tracks any of the java or kotlin files in the staging area.
-
Formats the code using spotless if there are any java/kotlin files.
-
It adds the files from step 1 again to the staging area, to pick up the re-formatted changes.
The commit now contains formatted code.
This saves a lot of time, instead of finding out that the build failed 5 minutes later.
The pre-commit
hook looks like:
If you use another formatter, you can easily update the script.
You can install it by running the following command in your repository root:
Continue reading →
Welcome back to the final blog in de series "How to hack a box"!
In this blog we’ll cover the basics of Privilege Escalation and see it in practice on the Blocky box from Hack The Box.
Continue reading →
Welcome back to the blog series about how to hack a box!
In the past few blogs we’ve gone through a few steps which gives you an idea of how you can hack a box.
We went from the Introduction, to Exploration, to Gaining Access.
In this blog, we’ll cover the basics of Enumeration.
|
DISCLAIMER: Never attempt to execute one of these steps on a machine where you don’t have explicit permission for from the owner.
This is illegal and will get you in trouble.
|
Continue reading →
The time is right. Your work is done. The last letter of your Java code has been written. You let the IDE compile the code and a new running version of your app is ready to be released. You’ve done this a thousand times, there’s nothing new on the horizon. The question of what lies beneath, what happens under the hood, has never occurred to you. Until now!
Continue reading →
When code evolves we usually deprecate old code.
Sometimes we come across deprecations without any hints with what to replace it with.
Kotlin has a solution for this by allowing you to specify a replace instruction.
For example, we created have an old REST client.
Continue reading →