Repository files navigation

xomda-common-java

Common utility methods, providing more power to streams and functions in general.

BufferedStream 💨 → 🥞 → 🐌

When streaming in an I/O context for example, it's not always guaranteed that the receiving end of the stream will be non-blocking. For example, when writing to the OutputStream of a slow HTTP connection, ultimately the stream which is being consumed is kept open for too long.

If the stream that you're consuming is a streaming resultset which keeps open an expensive data connection, then you want to close that stream as soon as possible. So it's best not to rely on the consuming capacity of the receiving end. A BufferedOutputStream is also not enough to catch that up.

That's where the BufferedStream comes in. It will consume the entire input stream as soon as the output stream polls for the first element. BufferedStream relies on an internal FIFO-stack, onto which the incoming stream is consumed and from which the going stream is going to grab items at the same time.

Remember that you can always build in multiple BufferedStreams, this way you can go from pile to (cheaper) pile. (💨 → 🍔 → 🥪 → 🥓 → 🐌)

It's possible upon construction to provide a Deque supplier, which will then be used as internal cache.
There are two built-in default cache implementations.

  1. Default Cache

    The default cache is just a class extending ConcurrentLinkedDeque. It's thread-safe, that's that.

  2. Limited Blocking Cache

    This cache extends the default cache, but blocks pushing as long as a maximum allowed number of items is reached. It will keep the incoming stream open for a longer amount of time, but it will reduce memory usage.

Predicates 🕵

Predicates is a set of helper methods which can help a lot when writing clean functional code. It's designed to replace common lambda's, using logical naming.

optional.filter(against(Person::getName, "John"));
optional.filter(against(Person::getEmail, not(String::isEmpty)));

There are helpers which create null-safe Predicates for usage with method references of Boolean-methods.

stream.filter(safe(SomeObject::getBoolean));

There are also helpers methods for creating cached Predicates, which will only evaluate once for each distinct value. This can be helpful when the Predicate houses an expensive operation, which does not change within the lifespan of the Predicate.

stream.filter(cached(ExpensiveMethod::call));

SneakyThrow 🥷

This sneaky caretaker has to be taken with care. It makes checked exceptions behave like runtime exceptions, by making them generic. This bypasses the Java compiler and is perfectly allowed within the JVM, which doesn't even know about checked exceptions.

The trick is done by turning the common java functions such as Consumer, Function, Supplier, ... into throwing ones. These throwing ones are just sub interfaces of the originals, so the original superclass is then returned. The throwing method is then caught and the exception is thrown genericly.

stream.forEach(sneaky(Files::readAllBytes));

The problem is now that everything is fine, but you know it may possibly throw an IOException. So in this case, it's advisable to have your method throw IOException too. It hands over resposibility to the caller of your method and everything is checked again.

It just comes in real handy when working with streams, but always remember that you're just hiding exceptions you would otherwise had to handle. And it's better to throw these exact exceptions, than to just throw a RuntimeException(e); out of lazyness. It keeps the code clean, but it requires responsibility.

About

Common Java Utils

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

xomda-common-java

Common utility methods, providing more power to streams and functions in general.

BufferedStream 💨 → 🥞 → 🐌

When streaming in an I/O context for example, it's not always guaranteed that the receiving end of the stream will be non-blocking. For example, when writing to the OutputStream of a slow HTTP connection, ultimately the stream which is being consumed is kept open for too long.

If the stream that you're consuming is a streaming resultset which keeps open an expensive data connection, then you want to close that stream as soon as possible. So it's best not to rely on the consuming capacity of the receiving end. A BufferedOutputStream is also not enough to catch that up.

That's where the BufferedStream comes in. It will consume the entire input stream as soon as the output stream polls for the first element. BufferedStream relies on an internal FIFO-stack, onto which the incoming stream is consumed and from which the going stream is going to grab items at the same time.

Remember that you can always build in multiple BufferedStreams, this way you can go from pile to (cheaper) pile. (💨 → 🍔 → 🥪 → 🥓 → 🐌)

It's possible upon construction to provide a Deque supplier, which will then be used as internal cache.
There are two built-in default cache implementations.

  1. Default Cache

    The default cache is just a class extending ConcurrentLinkedDeque. It's thread-safe, that's that.

  2. Limited Blocking Cache

    This cache extends the default cache, but blocks pushing as long as a maximum allowed number of items is reached. It will keep the incoming stream open for a longer amount of time, but it will reduce memory usage.

Predicates 🕵

Predicates is a set of helper methods which can help a lot when writing clean functional code. It's designed to replace common lambda's, using logical naming.

optional.filter(against(Person::getName, "John"));
optional.filter(against(Person::getEmail, not(String::isEmpty)));

There are helpers which create null-safe Predicates for usage with method references of Boolean-methods.

stream.filter(safe(SomeObject::getBoolean));

There are also helpers methods for creating cached Predicates, which will only evaluate once for each distinct value. This can be helpful when the Predicate houses an expensive operation, which does not change within the lifespan of the Predicate.

stream.filter(cached(ExpensiveMethod::call));

SneakyThrow 🥷

This sneaky caretaker has to be taken with care. It makes checked exceptions behave like runtime exceptions, by making them generic. This bypasses the Java compiler and is perfectly allowed within the JVM, which doesn't even know about checked exceptions.

The trick is done by turning the common java functions such as Consumer, Function, Supplier, ... into throwing ones. These throwing ones are just sub interfaces of the originals, so the original superclass is then returned. The throwing method is then caught and the exception is thrown genericly.

stream.forEach(sneaky(Files::readAllBytes));

The problem is now that everything is fine, but you know it may possibly throw an IOException. So in this case, it's advisable to have your method throw IOException too. It hands over resposibility to the caller of your method and everything is checked again.

It just comes in real handy when working with streams, but always remember that you're just hiding exceptions you would otherwise had to handle. And it's better to throw these exact exceptions, than to just throw a RuntimeException(e); out of lazyness. It keeps the code clean, but it requires responsibility.

About

Common Java Utils

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

xomda-common-java

Common utility methods, providing more power to streams and functions in general.

BufferedStream 💨 → 🥞 → 🐌

When streaming in an I/O context for example, it's not always guaranteed that the receiving end of the stream will be non-blocking. For example, when writing to the OutputStream of a slow HTTP connection, ultimately the stream which is being consumed is kept open for too long.

If the stream that you're consuming is a streaming resultset which keeps open an expensive data connection, then you want to close that stream as soon as possible. So it's best not to rely on the consuming capacity of the receiving end. A BufferedOutputStream is also not enough to catch that up.

That's where the BufferedStream comes in. It will consume the entire input stream as soon as the output stream polls for the first element. BufferedStream relies on an internal FIFO-stack, onto which the incoming stream is consumed and from which the going stream is going to grab items at the same time.

Remember that you can always build in multiple BufferedStreams, this way you can go from pile to (cheaper) pile. (💨 → 🍔 → 🥪 → 🥓 → 🐌)

It's possible upon construction to provide a Deque supplier, which will then be used as internal cache.
There are two built-in default cache implementations.

  1. Default Cache

    The default cache is just a class extending ConcurrentLinkedDeque. It's thread-safe, that's that.

  2. Limited Blocking Cache

    This cache extends the default cache, but blocks pushing as long as a maximum allowed number of items is reached. It will keep the incoming stream open for a longer amount of time, but it will reduce memory usage.

Predicates 🕵

Predicates is a set of helper methods which can help a lot when writing clean functional code. It's designed to replace common lambda's, using logical naming.

optional.filter(against(Person::getName, "John"));
optional.filter(against(Person::getEmail, not(String::isEmpty)));

There are helpers which create null-safe Predicates for usage with method references of Boolean-methods.

stream.filter(safe(SomeObject::getBoolean));

There are also helpers methods for creating cached Predicates, which will only evaluate once for each distinct value. This can be helpful when the Predicate houses an expensive operation, which does not change within the lifespan of the Predicate.

stream.filter(cached(ExpensiveMethod::call));

SneakyThrow 🥷

This sneaky caretaker has to be taken with care. It makes checked exceptions behave like runtime exceptions, by making them generic. This bypasses the Java compiler and is perfectly allowed within the JVM, which doesn't even know about checked exceptions.

The trick is done by turning the common java functions such as Consumer, Function, Supplier, ... into throwing ones. These throwing ones are just sub interfaces of the originals, so the original superclass is then returned. The throwing method is then caught and the exception is thrown genericly.

stream.forEach(sneaky(Files::readAllBytes));

The problem is now that everything is fine, but you know it may possibly throw an IOException. So in this case, it's advisable to have your method throw IOException too. It hands over resposibility to the caller of your method and everything is checked again.

It just comes in real handy when working with streams, but always remember that you're just hiding exceptions you would otherwise had to handle. And it's better to throw these exact exceptions, than to just throw a RuntimeException(e); out of lazyness. It keeps the code clean, but it requires responsibility.

About

Common Java Utils

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

xomda-common-java

Common utility methods, providing more power to streams and functions in general.

BufferedStream 💨 → 🥞 → 🐌

When streaming in an I/O context for example, it's not always guaranteed that the receiving end of the stream will be non-blocking. For example, when writing to the OutputStream of a slow HTTP connection, ultimately the stream which is being consumed is kept open for too long.

If the stream that you're consuming is a streaming resultset which keeps open an expensive data connection, then you want to close that stream as soon as possible. So it's best not to rely on the consuming capacity of the receiving end. A BufferedOutputStream is also not enough to catch that up.

That's where the BufferedStream comes in. It will consume the entire input stream as soon as the output stream polls for the first element. BufferedStream relies on an internal FIFO-stack, onto which the incoming stream is consumed and from which the going stream is going to grab items at the same time.

Remember that you can always build in multiple BufferedStreams, this way you can go from pile to (cheaper) pile. (💨 → 🍔 → 🥪 → 🥓 → 🐌)

It's possible upon construction to provide a Deque supplier, which will then be used as internal cache.
There are two built-in default cache implementations.

  1. Default Cache

    The default cache is just a class extending ConcurrentLinkedDeque. It's thread-safe, that's that.

  2. Limited Blocking Cache

    This cache extends the default cache, but blocks pushing as long as a maximum allowed number of items is reached. It will keep the incoming stream open for a longer amount of time, but it will reduce memory usage.

Predicates 🕵

Predicates is a set of helper methods which can help a lot when writing clean functional code. It's designed to replace common lambda's, using logical naming.

optional.filter(against(Person::getName, "John"));
optional.filter(against(Person::getEmail, not(String::isEmpty)));

There are helpers which create null-safe Predicates for usage with method references of Boolean-methods.

stream.filter(safe(SomeObject::getBoolean));

There are also helpers methods for creating cached Predicates, which will only evaluate once for each distinct value. This can be helpful when the Predicate houses an expensive operation, which does not change within the lifespan of the Predicate.

stream.filter(cached(ExpensiveMethod::call));

SneakyThrow 🥷

This sneaky caretaker has to be taken with care. It makes checked exceptions behave like runtime exceptions, by making them generic. This bypasses the Java compiler and is perfectly allowed within the JVM, which doesn't even know about checked exceptions.

The trick is done by turning the common java functions such as Consumer, Function, Supplier, ... into throwing ones. These throwing ones are just sub interfaces of the originals, so the original superclass is then returned. The throwing method is then caught and the exception is thrown genericly.

stream.forEach(sneaky(Files::readAllBytes));

The problem is now that everything is fine, but you know it may possibly throw an IOException. So in this case, it's advisable to have your method throw IOException too. It hands over resposibility to the caller of your method and everything is checked again.

It just comes in real handy when working with streams, but always remember that you're just hiding exceptions you would otherwise had to handle. And it's better to throw these exact exceptions, than to just throw a RuntimeException(e); out of lazyness. It keeps the code clean, but it requires responsibility.

About

Common Java Utils

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

xomda-common-java

Common utility methods, providing more power to streams and functions in general.

BufferedStream 💨 → 🥞 → 🐌

When streaming in an I/O context for example, it's not always guaranteed that the receiving end of the stream will be non-blocking. For example, when writing to the OutputStream of a slow HTTP connection, ultimately the stream which is being consumed is kept open for too long.

If the stream that you're consuming is a streaming resultset which keeps open an expensive data connection, then you want to close that stream as soon as possible. So it's best not to rely on the consuming capacity of the receiving end. A BufferedOutputStream is also not enough to catch that up.

That's where the BufferedStream comes in. It will consume the entire input stream as soon as the output stream polls for the first element. BufferedStream relies on an internal FIFO-stack, onto which the incoming stream is consumed and from which the going stream is going to grab items at the same time.

Remember that you can always build in multiple BufferedStreams, this way you can go from pile to (cheaper) pile. (💨 → 🍔 → 🥪 → 🥓 → 🐌)

It's possible upon construction to provide a Deque supplier, which will then be used as internal cache.
There are two built-in default cache implementations.

  1. Default Cache

    The default cache is just a class extending ConcurrentLinkedDeque. It's thread-safe, that's that.

  2. Limited Blocking Cache

    This cache extends the default cache, but blocks pushing as long as a maximum allowed number of items is reached. It will keep the incoming stream open for a longer amount of time, but it will reduce memory usage.

Predicates 🕵

Predicates is a set of helper methods which can help a lot when writing clean functional code. It's designed to replace common lambda's, using logical naming.

optional.filter(against(Person::getName, "John"));
optional.filter(against(Person::getEmail, not(String::isEmpty)));

There are helpers which create null-safe Predicates for usage with method references of Boolean-methods.

stream.filter(safe(SomeObject::getBoolean));

There are also helpers methods for creating cached Predicates, which will only evaluate once for each distinct value. This can be helpful when the Predicate houses an expensive operation, which does not change within the lifespan of the Predicate.

stream.filter(cached(ExpensiveMethod::call));

SneakyThrow 🥷

This sneaky caretaker has to be taken with care. It makes checked exceptions behave like runtime exceptions, by making them generic. This bypasses the Java compiler and is perfectly allowed within the JVM, which doesn't even know about checked exceptions.

The trick is done by turning the common java functions such as Consumer, Function, Supplier, ... into throwing ones. These throwing ones are just sub interfaces of the originals, so the original superclass is then returned. The throwing method is then caught and the exception is thrown genericly.

stream.forEach(sneaky(Files::readAllBytes));

The problem is now that everything is fine, but you know it may possibly throw an IOException. So in this case, it's advisable to have your method throw IOException too. It hands over resposibility to the caller of your method and everything is checked again.

It just comes in real handy when working with streams, but always remember that you're just hiding exceptions you would otherwise had to handle. And it's better to throw these exact exceptions, than to just throw a RuntimeException(e); out of lazyness. It keeps the code clean, but it requires responsibility.

About

Common Java Utils

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

xomda-common-java

Common utility methods, providing more power to streams and functions in general.

BufferedStream 💨 → 🥞 → 🐌

When streaming in an I/O context for example, it's not always guaranteed that the receiving end of the stream will be non-blocking. For example, when writing to the OutputStream of a slow HTTP connection, ultimately the stream which is being consumed is kept open for too long.

If the stream that you're consuming is a streaming resultset which keeps open an expensive data connection, then you want to close that stream as soon as possible. So it's best not to rely on the consuming capacity of the receiving end. A BufferedOutputStream is also not enough to catch that up.

That's where the BufferedStream comes in. It will consume the entire input stream as soon as the output stream polls for the first element. BufferedStream relies on an internal FIFO-stack, onto which the incoming stream is consumed and from which the going stream is going to grab items at the same time.

Remember that you can always build in multiple BufferedStreams, this way you can go from pile to (cheaper) pile. (💨 → 🍔 → 🥪 → 🥓 → 🐌)

It's possible upon construction to provide a Deque supplier, which will then be used as internal cache.
There are two built-in default cache implementations.

  1. Default Cache

    The default cache is just a class extending ConcurrentLinkedDeque. It's thread-safe, that's that.

  2. Limited Blocking Cache

    This cache extends the default cache, but blocks pushing as long as a maximum allowed number of items is reached. It will keep the incoming stream open for a longer amount of time, but it will reduce memory usage.

Predicates 🕵

Predicates is a set of helper methods which can help a lot when writing clean functional code. It's designed to replace common lambda's, using logical naming.

optional.filter(against(Person::getName, "John"));
optional.filter(against(Person::getEmail, not(String::isEmpty)));

There are helpers which create null-safe Predicates for usage with method references of Boolean-methods.

stream.filter(safe(SomeObject::getBoolean));

There are also helpers methods for creating cached Predicates, which will only evaluate once for each distinct value. This can be helpful when the Predicate houses an expensive operation, which does not change within the lifespan of the Predicate.

stream.filter(cached(ExpensiveMethod::call));

SneakyThrow 🥷

This sneaky caretaker has to be taken with care. It makes checked exceptions behave like runtime exceptions, by making them generic. This bypasses the Java compiler and is perfectly allowed within the JVM, which doesn't even know about checked exceptions.

The trick is done by turning the common java functions such as Consumer, Function, Supplier, ... into throwing ones. These throwing ones are just sub interfaces of the originals, so the original superclass is then returned. The throwing method is then caught and the exception is thrown genericly.

stream.forEach(sneaky(Files::readAllBytes));

The problem is now that everything is fine, but you know it may possibly throw an IOException. So in this case, it's advisable to have your method throw IOException too. It hands over resposibility to the caller of your method and everything is checked again.

It just comes in real handy when working with streams, but always remember that you're just hiding exceptions you would otherwise had to handle. And it's better to throw these exact exceptions, than to just throw a RuntimeException(e); out of lazyness. It keeps the code clean, but it requires responsibility.

About

Common Java Utils

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

xomda-common-java

Common utility methods, providing more power to streams and functions in general.

BufferedStream 💨 → 🥞 → 🐌

When streaming in an I/O context for example, it's not always guaranteed that the receiving end of the stream will be non-blocking. For example, when writing to the OutputStream of a slow HTTP connection, ultimately the stream which is being consumed is kept open for too long.

If the stream that you're consuming is a streaming resultset which keeps open an expensive data connection, then you want to close that stream as soon as possible. So it's best not to rely on the consuming capacity of the receiving end. A BufferedOutputStream is also not enough to catch that up.

That's where the BufferedStream comes in. It will consume the entire input stream as soon as the output stream polls for the first element. BufferedStream relies on an internal FIFO-stack, onto which the incoming stream is consumed and from which the going stream is going to grab items at the same time.

Remember that you can always build in multiple BufferedStreams, this way you can go from pile to (cheaper) pile. (💨 → 🍔 → 🥪 → 🥓 → 🐌)

It's possible upon construction to provide a Deque supplier, which will then be used as internal cache.
There are two built-in default cache implementations.

  1. Default Cache

    The default cache is just a class extending ConcurrentLinkedDeque. It's thread-safe, that's that.

  2. Limited Blocking Cache

    This cache extends the default cache, but blocks pushing as long as a maximum allowed number of items is reached. It will keep the incoming stream open for a longer amount of time, but it will reduce memory usage.

Predicates 🕵

Predicates is a set of helper methods which can help a lot when writing clean functional code. It's designed to replace common lambda's, using logical naming.

optional.filter(against(Person::getName, "John"));
optional.filter(against(Person::getEmail, not(String::isEmpty)));

There are helpers which create null-safe Predicates for usage with method references of Boolean-methods.

stream.filter(safe(SomeObject::getBoolean));

There are also helpers methods for creating cached Predicates, which will only evaluate once for each distinct value. This can be helpful when the Predicate houses an expensive operation, which does not change within the lifespan of the Predicate.

stream.filter(cached(ExpensiveMethod::call));

SneakyThrow 🥷

This sneaky caretaker has to be taken with care. It makes checked exceptions behave like runtime exceptions, by making them generic. This bypasses the Java compiler and is perfectly allowed within the JVM, which doesn't even know about checked exceptions.

The trick is done by turning the common java functions such as Consumer, Function, Supplier, ... into throwing ones. These throwing ones are just sub interfaces of the originals, so the original superclass is then returned. The throwing method is then caught and the exception is thrown genericly.

stream.forEach(sneaky(Files::readAllBytes));

The problem is now that everything is fine, but you know it may possibly throw an IOException. So in this case, it's advisable to have your method throw IOException too. It hands over resposibility to the caller of your method and everything is checked again.

It just comes in real handy when working with streams, but always remember that you're just hiding exceptions you would otherwise had to handle. And it's better to throw these exact exceptions, than to just throw a RuntimeException(e); out of lazyness. It keeps the code clean, but it requires responsibility.

About

Common Java Utils

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

xomda-common-java

Common utility methods, providing more power to streams and functions in general.

BufferedStream 💨 → 🥞 → 🐌

When streaming in an I/O context for example, it's not always guaranteed that the receiving end of the stream will be non-blocking. For example, when writing to the OutputStream of a slow HTTP connection, ultimately the stream which is being consumed is kept open for too long.

If the stream that you're consuming is a streaming resultset which keeps open an expensive data connection, then you want to close that stream as soon as possible. So it's best not to rely on the consuming capacity of the receiving end. A BufferedOutputStream is also not enough to catch that up.

That's where the BufferedStream comes in. It will consume the entire input stream as soon as the output stream polls for the first element. BufferedStream relies on an internal FIFO-stack, onto which the incoming stream is consumed and from which the going stream is going to grab items at the same time.

Remember that you can always build in multiple BufferedStreams, this way you can go from pile to (cheaper) pile. (💨 → 🍔 → 🥪 → 🥓 → 🐌)

It's possible upon construction to provide a Deque supplier, which will then be used as internal cache.
There are two built-in default cache implementations.

  1. Default Cache

    The default cache is just a class extending ConcurrentLinkedDeque. It's thread-safe, that's that.

  2. Limited Blocking Cache

    This cache extends the default cache, but blocks pushing as long as a maximum allowed number of items is reached. It will keep the incoming stream open for a longer amount of time, but it will reduce memory usage.

Predicates 🕵

Predicates is a set of helper methods which can help a lot when writing clean functional code. It's designed to replace common lambda's, using logical naming.

optional.filter(against(Person::getName, "John"));
optional.filter(against(Person::getEmail, not(String::isEmpty)));

There are helpers which create null-safe Predicates for usage with method references of Boolean-methods.

stream.filter(safe(SomeObject::getBoolean));

There are also helpers methods for creating cached Predicates, which will only evaluate once for each distinct value. This can be helpful when the Predicate houses an expensive operation, which does not change within the lifespan of the Predicate.

stream.filter(cached(ExpensiveMethod::call));

SneakyThrow 🥷

This sneaky caretaker has to be taken with care. It makes checked exceptions behave like runtime exceptions, by making them generic. This bypasses the Java compiler and is perfectly allowed within the JVM, which doesn't even know about checked exceptions.

The trick is done by turning the common java functions such as Consumer, Function, Supplier, ... into throwing ones. These throwing ones are just sub interfaces of the originals, so the original superclass is then returned. The throwing method is then caught and the exception is thrown genericly.

stream.forEach(sneaky(Files::readAllBytes));

The problem is now that everything is fine, but you know it may possibly throw an IOException. So in this case, it's advisable to have your method throw IOException too. It hands over resposibility to the caller of your method and everything is checked again.

It just comes in real handy when working with streams, but always remember that you're just hiding exceptions you would otherwise had to handle. And it's better to throw these exact exceptions, than to just throw a RuntimeException(e); out of lazyness. It keeps the code clean, but it requires responsibility.

About

Common Java Utils

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages